注意:在上个周末我们升级到Oauth 2.0工作流程之前,我们的(网络)应用程序运行良好。

当用户“与Facebook连接”到我们的(网络)应用程序时,我们使用Facebook Authentication docs中描述的“服务器端工作流程”将其登录到Facebook。但是,当用户进入我们的应用程序中包含以下javascript代码的主页时,Facebook会引发auth.logout事件:

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 2.0中是否需要采取其他步骤将用户登录到我们的应用程序,而在以前的OAuth版本中并不需要该步骤?连接后用户是否必须通过Facebook明确登录?

任何帮助将非常感激。

提前致谢,
杰森

PS-通过客户端流程(在您之前建立连接之后)登录到我们的应用程序就可以了。只有在通过服务器端工作流程进行连接和登录时,我们才会遇到自动注销问题。

最佳答案

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

这是iframe和ajax的标准,可防止Clickjack以及其他安全风险。
查看: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 }

?>

09-11 17:40