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注销
将 Facebook PHP 或 JS SDK 连接到 Joomla
在 laravel 中访问 facebook php sdk 4.0 和 Javascript sdk 上的 Token