使用“服务器端工作流程”(OAuth 2.0)登录后,正在引发 FB auth.logout
Posted
技术标签:
【中文标题】使用“服务器端工作流程”(OAuth 2.0)登录后,正在引发 FB auth.logout【英文标题】:FB auth.logout is being raised after being logged in using the "server-side-workflow" (OAuth 2.0) 【发布时间】:2011-11-30 00:57:03 【问题描述】:注意:在上周末我们升级到 Oauth 2.0 工作流程之前,我们的(网络)应用程序运行良好。
当用户“通过 facebook 连接”到我们的(网络)应用程序时,我们使用 Facebook Authentication docs 中描述的“服务器端工作流程”将他们登录到 Facebook。但是,当用户在我们的应用程序中访问他们的主页时,Facebook 会引发 auth.logout 事件,该主页包含以下 javascript 代码:
window.fbAsyncInit = function()
FB.init(appId: 'XXX', status: true, cookie: true, xfbml: true, channelUrl: 'http://XXX/fbchannel.html', oauth: true);
FB.Event.subscribe('auth.logout', function(response)
logout();
);
;
(function()
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
e.async = true;
document.getElementById('fb-root').appendChild(e);
());
function logout()
new Ajax.Request('http://XXX/logout');
似乎当用户登录 Facebook 时,他们并没有登录我们的应用程序(如果您在浏览器的第二个选项卡中打开了 facebook.com 并在通过我们的应用程序登录后重新加载页面,那么您将看到您确实已登录到 facebook.com)。
在使用以前版本的 OAuth 中不需要的“服务器端工作流程”时,OAuth 2.0 中是否需要采取额外步骤将用户登录到我们的应用程序?连接后用户是否必须通过 facebook 显式登录?
任何帮助将不胜感激。
提前致谢, 杰森
PS- 通过客户端流程登录到我们的应用程序(在您之前连接之后)可以正常工作。只有在通过服务器端工作流程连接和登录时,我们才会遇到自动注销问题。
【问题讨论】:
我能够通过在我的 auth.logout 事件处理程序中添加对 FB.getLoginStatus 的调用并检查 authResponse 对象的响应来解决此问题。我不知道为什么 Facebook 在 FB.getLoginStatus 返回指示用户已登录的 authResponse 时引发 auth.logout ,但是确实如此。所以,这是一个 hack: FB.Event.subscribe('auth.logout', function(response) FB.getLoginStatus(function(res) if(!res.authResponse) logout(); ); ); 很棒的发现!我想知道它是否仍然存在,或者 Facebook 是否已修复此问题... 我今天也刚开始在我的应用程序中看到这种行为。我想出了和你一样的技巧,但我有点不舒服。 【参考方案1】:对于 ajax 页面,您需要从浏览器会话中获取 uid、access_token 和/或代码。
这是用于防止点击劫持和其他安全风险的 iframe 和 ajax 标准。 见:https://www.rfc-editor.org/rfc/rfc6749#section-10.13
简单粗暴的例子:
<?php
// be sure to exchange YourAppId, with your app id.
if(isset([fb_YourAppId_user_id]))
$user = [fb_YourAppId_user_id];
else // no user, send to login flow.
if(isset([fb_YourAppId_access_token]))
$access_token = [fb_YourAppId_access_token];
else // no user, send to login flow
?>
【讨论】:
以上是关于使用“服务器端工作流程”(OAuth 2.0)登录后,正在引发 FB auth.logout的主要内容,如果未能解决你的问题,请参考以下文章
如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录
如何检查用户是不是使用“谷歌登录”(OAuth 2.0)登录