2011-10-03 96 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 } 

?> 
相關問題