Facebook服务器端身份验证流程:这是正确的吗;代码?“;

Facebook服务器端身份验证流程:这是正确的吗;代码?“;,facebook,Facebook,我在JS客户端上使用FB.login,希望在服务器上验证用户的身份。因此,客户端从facebook获得signedRequest并将其发送到服务器。服务器在句点上拆分,并将signedRequest的第二部分解码为json对象 当我将服务器端请求发送到时,“代码”应该使用什么 https://graph.facebook.com/oauth/access_token? client_id=YOUR_APP_ID &redirect_uri=YOUR_REDIRECT_URI

我在JS客户端上使用FB.login,希望在服务器上验证用户的身份。因此,客户端从facebook获得signedRequest并将其发送到服务器。服务器在句点上拆分,并将signedRequest的第二部分解码为json对象

当我将服务器端请求发送到时,“代码”应该使用什么

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID
   &redirect_uri=YOUR_REDIRECT_URI
   &client_secret=YOUR_APP_SECRET
   &code=CODE_GENERATED_BY_FACEBOOK
我的解码json看起来像:

{"algorithm":"HMAC-SHA256","code":"2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g","issued_at":1335642445,"user_id":"5232286"}
这就是我需要的密码吗?它需要B64编码吗?如果这不是代码,我应该使用什么代码

_

我所尝试的: 我尝试使用的请求是:

https://graph.facebook.com/oauth/access_token?client_id=295410083869479&redirect_uri=https://squaredme.appspot.com/facebookredirect&client_secret=44f1TOPSECRETbb8e&code=2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g
但这会返回错误:

{"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}

我不知道这是因为我使用了错误的代码还是什么。值得注意的是,这是在我的本地开发服务器上运行的,squaredme.appspot.com肯定不会解析到我的IP。我不知道facebook是否会检查这一点,我想我会得到一条更好的错误消息。谢谢你的指点

您试图以某种方式将这两个流组合在一起,这就是为什么事情不能很好地工作

当facebook使用你的应用程序url和签名请求发布到iframe时,有两个选项,简单的一个是用户已经通过身份验证,然后签名请求将拥有所有必要的数据(包括签名请求),然后你只需加载画布页面并使用JS SDK在那里获取访问令牌,但是在这种情况下,不需要使用FB.login(因为它会打开一个弹出窗口并自动关闭),您可以使用不会打扰用户的方法

如果用户未经过身份验证,那么签名请求将丢失使用graph api所需的内容。 然后,您将用户重定向到,由于您是在iframe中加载的,因此需要返回一个html响应,该响应使用javascript重定向父窗口,如:

top.location.href = "AUTH_DIALOG_URL";
当使用完成(接受或拒绝应用程序)后,他将被重定向到您作为参数添加到auth对话框的“redirect_uri”。 如果用户接受了您的应用程序,那么您将在查询字符串中获得“code”参数。 然后,您获取代码,在问题中发布时与访问令牌交换,然后将用户重定向回“apps.facebook.com/your_APP”

当页面加载时,用户已经通过身份验证,您将得到一个完全签名的请求


我希望这能为您澄清问题,重新检查流程,它几乎涵盖了所有内容。

您试图以某种方式将这两个流程结合在一起,这就是为什么事情不能很好地工作的原因

当facebook使用你的应用程序url和签名请求发布到iframe时,有两个选项,简单的一个是用户已经通过身份验证,然后签名请求将拥有所有必要的数据(包括签名请求),然后你只需加载画布页面并使用JS SDK在那里获取访问令牌,但是在这种情况下,不需要使用FB.login(因为它会打开一个弹出窗口并自动关闭),您可以使用不会打扰用户的方法

如果用户未经过身份验证,那么签名请求将丢失使用graph api所需的内容。 然后,您将用户重定向到,由于您是在iframe中加载的,因此需要返回一个html响应,该响应使用javascript重定向父窗口,如:

top.location.href = "AUTH_DIALOG_URL";
当使用完成(接受或拒绝应用程序)后,他将被重定向到您作为参数添加到auth对话框的“redirect_uri”。 如果用户接受了您的应用程序,那么您将在查询字符串中获得“code”参数。 然后,您获取代码,在问题中发布时与访问令牌交换,然后将用户重定向回“apps.facebook.com/your_APP”

当页面加载时,用户已经通过身份验证,您将得到一个完全签名的请求


我希望这能为您澄清问题,重新检查一下,它几乎涵盖了所有内容。

我也遇到了一些问题,然后我在StackOverflow中找到了解决方案。 facebook提供了两种“代码”。一个位于客户端流生成的cookie中的signedRequest内部。Facebook的JSSDK处理这些代码,并在不告诉我们任何信息的情况下获取访问令牌

另一种类型的代码作为查询附加到重定向URI(http://www.yoururl.com/index.php?code=AAAgyiaus...),当您导航到OAuth URL(服务器端流)时。使用此代码,您可以转到令牌URL并获取访问令牌

当您使用服务器端流时,需要在OAuth URL和令牌URL中指示重定向URI,并且它们必须完全相同,因此缺少斜杠或查询字符串可能会有很多问题

这些代码彼此不同。当您同时使用这两种方法时,似乎不可能使用cookie的signedRequest中的代码获取访问令牌

但事实并非如此。神奇的是:signedRequest中的代码没有与URI关联,因此只要redirect_URI是一个必填字段,您所要做的就是在导航到令牌URL时将其传递为空

因此,最终的解决方案是:从cookie中获取signedRequest,在服务器中解析它以获得代码,然后读取令牌URL:


它看起来像黑客,所以我不知道它能工作多久,但它现在正在工作

我也遇到了一些问题,然后我在StackOverflow中找到了解决方案。 facebook提供了两种“代码”。一个位于客户端流生成的cookie中的signedRequest内部。Facebook的JSSDK处理这些代码,并在不告诉我们任何信息的情况下获取访问令牌

另一种类型的代码作为查询附加到重定向URI(http://www.yoururl.com/index.php?code=AAAgyiaus...),当您导航到OAuth URL(服务器端流)时。使用此代码,您可以转到令牌URL并获取您的