Facebook JS+PHP SDK 返回异常 此授权码已过期

Posted

技术标签:

【中文标题】Facebook JS+PHP SDK 返回异常 此授权码已过期【英文标题】:Facebook JS+PHP SDK returns exception This authorization code has expired 【发布时间】:2015-05-20 13:49:41 【问题描述】:

我们正在使用 JS 和 php SDK 在我们的 Web 应用程序上创建自定义登录过程。一切正常,直到我们发现一些用户无法重新登录(通过触发 FB.login())。

经过一些研究,我们发现用户在很长一段时间后返回网站,并且 SDK 给出了异常:“此授权码已过期。” .

我们使用的是扩展令牌,有效期为 60 天,到期时必须发行新令牌。这是通过将用户带入登录过程自动完成的。

如果这是正确的,为什么每次用户尝试使用 Facebook 登录到我们的网站时,即使在调用 FB.login() 之后我们也会收到异常?

登录过程:

登录过程是 JS 和 AJAX 调用的混合,用于将用户登录到 Facebook,然后登录到网站。

1- 用户进入网站

2- 用户点击“使用 Facebook 登录”按钮

3- 触发 FB.login() 并通过 AJAX 调用 PHP 脚本

通过 AJAX 执行的 PHP 代码:

$helper = new FacebookjavascriptLoginHelper();

try 
    $FBsession = $helper->getSession();
 catch(FacebookRequestException $ex) 
    // When Facebook returns an error
    // $ex->getMessage() == 'This authorization code has expired.' 
 catch(\Exception $ex) 
    // When validation fails or other local issues

我不能保证,我不知道这是否有关系,但大多数情况是移动用户在他们第一次访问我们的网站并登录 m.facebook.com 时被要求授予对我们应用的访问权限。

提前致谢

【问题讨论】:

【参考方案1】:

登录操作后 facebook 将用户发送到哪里(我假设您在下面粘贴了代码)尝试:

$session = $helper->getSessionFromRedirect();

【讨论】:

并确保您已在应用程序的设置/高级中完成“有效 OAuth 重定向 URI”字段。 您好,感谢您的评论。我使用 JS SDK 处理登录,然后 PHP SDK 通过 FacebookJavaScriptLoginHelper 获取 JS 设置的 cookie,然后在网站上执行内部登录过程。 FacebookJavaScriptLoginHelper 是访问 JS 在 PHP 上设置的 cookie 的唯一途径。【参考方案2】:

我终于能够与可以重现问题的移动设备取得联系。

调试浏览器后,我可以看到设置了两个 fbsr_ cookie。一个指向“.domain.com”(注意域名前面的句点),另一个指向“domain.com”。 删除“domain.com”下的那个后异常消失了,我可以正确登录了。

PHP SDK 检查:

$_COOKIE['fbsr_' . $this->appId]

它选择了“错误”的那个。 现在我想知道,这是怎么发生的?

【讨论】:

我不知道你为什么会遇到这个问题,但是 facebook id 说这样的话:“重要的是要注意,在第一次访问时,或者如果会话已经过期,这些方法将在数据是一个请求周期陈旧的数据。当登录状态在 Facebook SDK for JavaScript 中更改时,您可能希望发出 Ajax 请求。有关此信息的信息:FB.event.subscribe。为什么不使用 PHP sdk 和登录流程?您只需要显示登录网址...用户按下它...您不需要获取扩展令牌。我希望你能找到克服的方法。继续加油!【参考方案3】:

此答案适用于出于某种原因使用 v3 的人。

在函数getAccessTokenFromCode 中,_oauthRequest 的结果可能是 JSON 格式,而不是 URL 格式。在代码中,结果是使用parse_str() 进行转换,因此不会返回正确的access_token

【讨论】:

以上是关于Facebook JS+PHP SDK 返回异常 此授权码已过期的主要内容,如果未能解决你的问题,请参考以下文章

Facebook-connect:无法使用PHP SDK + JS SDK注销

会话总是返回 null facebook php sdk

将 Facebook PHP 或 JS SDK 连接到 Joomla

在 laravel 中访问 facebook php sdk 4.0 和 Javascript sdk 上的 Token

php sdk 的 Facebook 'redirect_uri' 参数未重定向到传递的 uri(仅重定向返回主页)

Facebook 登录:如何将 JavaScript 与 PHP SDK 结合起来?