使用“服务器端工作流程”(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)登录

使用 Google oAuth 2.0 时新用户登录时刷新页面

使用带有 C# 的 Google OAuth 2.0 登录

使用带有 C# 的 Google OAuth 2.0 登录

谷歌 Oauth 2.0 注销