1

我在 JS 客户端上使用 FB.login 并想在服务器上验证用户的身份。因此,客户端从 facebook 获得一个 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 是否会检查或检查什么 - 我假设我会收到更好的错误消息。感谢您的任何指导!

4

2 回答 2

4

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

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

如果用户未通过身份验证,则签名请求将丢失使用图形 api 所需的内容。然后,您将用户重定向到auth dialog,并且由于您已加载到 iframe 中,因此您需要返回一个 html 响应,该响应使用 javascript 重定向父窗口,例如:

top.location.href = "AUTH_DIALOG_URL";

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

然后加载页面时,用户已经通过身份验证,您将获得完整签名的请求。

我希望这可以为您澄清事情,重新检查服务器端流程,它几乎涵盖了所有内容。

于 2012-04-28T20:10:54.800 回答
1

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

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

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

代码彼此不同。当您同时使用这两种东西时,似乎不可能使用 cookie 的已签名请求中的代码获取访问令牌。

但是,事实并非如此。神奇之处在于:signedRequest 的代码与 NO URI 相关联,因此只要 redirect_uri 是必填字段,您只需在导航到 Token URL 时将其传递为空白即可。

所以最终的解决方案是:从cookie中获取signedRequest,在你的服务器中解析得到代码,然后读取Token URL

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID
    &redirect_uri=&client_secret=YOUR_APP_SECRET
    &code=CODE_INSIDE_THE_SIGNED_REQUEST

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

于 2012-07-25T16:34:08.977 回答