2011-10-03 64 views
6

登录后,将激发FB auth.logout注意:我们的(网络)应用程序工作正常,直到上周末升级到Oauth 2.0工作流程。使用“服务器端工作流程”(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-登录到通过客户端的流量我们的应用程序(你曾经连接后)的作品就好了。只有在通过服务器端工作流连接和登录时,我们才会遇到自动注销问题。

+3

我能够在我的auth.logout事件处理程序添加到FB.getLoginStatus呼叫并检查响应来解决这个问题对于authResponse对象。我不知道为什么Facebook在FB.getLoginStatus返回一个authResponse指示用户已经登录时提出auth.logout,但是,它确实如此。因此,这是一个黑客:FB.Event.subscribe('auth.logout',函数(响应){FB.getLoginStatus(函数(res){!res.authResponse} { logout(); } }); }); – Jason

+0

很棒的发现!我不知道它是否仍然存在,或者Facebook是否已经修复了这个问题...... – DMCS

+0

我刚刚开始在我的应用程序中看到这种行为。我提出了和你一样的黑客攻击,但我对它有点不舒服。 –

回答

0

对于ajax页面,您需要从浏览器会话中获取uid,access_token和/或代码。

这是iframe和ajax防止点击劫持以及其他安全风险的标准。 SEE:http://tools.ietf.org/html/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 } 

?> 
相关问题