2011-05-25 132 views
3

我的網站使用Facebook的連接用於登錄,我的服務器上的會話有效期是3600Facebook的自動重新登錄

我使用Client-Side Flow(JavaScript)的重定向到login.php中,和的login.php檢索cookie(由javascript設置)以獲取訪問令牌。

但是,如果用戶閒置超過3600秒,則服務器上的會話過期。 ($ _SESSION ['uid']不存在。) 我的login.php如何檢查用戶是否已經登錄Facebook(不是我的應用)?

我正在使用的解決方案是將用戶重定向到我的JavaScript頁面,並且「onStatus函數」將被facebook自動觸發。

我正在尋找一個解決方案,可以使用login.php來自動重新登錄我的網站,如果他或她已經登錄Facebook(無需重定向到JavaScript頁面)。有可能嗎?

的javascript:(用於登錄)

FB.init({appId: 'MY_APP_ID', status: true, cookie: true, xfbml: true}); 

FB.getLoginStatus(function(response) { 
    onStatus(response); 
    FB.Event.subscribe('auth.statusChange', onStatus); 
    FB.Event.subscribe('auth.login', reloadPage); 
}); 

function onStatus(response) { 
    if (response.session) { 
     window.location.href = '/login?fb'; 
    } 
} 

function reloadPage(response) { 
    if (response.session) { 
     window.location.href = '/login?fb'; 
    } 
} 

PHP:

function get_facebook_cookie($app_id, $app_secret) { 
    $args = array(); 
    if(!isset($_COOKIE['fbs_' . $app_id])) 
     return false; 
    parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
    ksort($args); 
    $payload = ''; 
    foreach ($args as $key => $value) { 
    if ($key != 'sig') { 
     $payload .= $key . '=' . $value; 
    } 
    } 
    if (md5($payload . $app_secret) != $args['sig']) { 
     return false; 
    } 
    return $args; 
} 

$cookie = get_facebook_cookie(MY_APP_ID, MY_APP_SECRET); 

if($cookie){ 
    if($result = @file_get_contents("https://graph.facebook.com/me/?access_token=".$cookie['access_token'])){ 
     $result = json_decode($result, true); 
     $_SESSION['uid'] = $result['id']; 
    } 

回答

2

我已經想出了一種方法來做到這一點。在所有頁面中對下一頁進行iframe。

當facebook通過cookie給出的訪問令牌到期時,iframe中的頁面自動刷新。 而FB.init()會爲我的應用程序設置一個新的訪問令牌(cookie)。

在我的php文件中,只檢查第一次連接的cookie。

fb_keepalive.html:

<div id="fb-root"></div> 
<script type="text/javascript" src="https://connect.facebook.net/zh_TW/all.js"></script> 
<script type="text/javascript"> 
FB.init({appId: 'APP_ID', status: true, cookie: true, xfbml: true}); 
FB.getLoginStatus(function(response) { 
    onStatus(response); 
}); 

function onStatus(response) { 
    if (response.session) { 
     var timestamp = new Date().getTime(); 
     var expires = response['session']['expires'] * 1000; 
     if(expires - timestamp >= 0){ 
      setTimeout(function(){window.location.reload();}, expires - timestamp); 
     } 
    } 
} 
</script> 
+0

並將參數傳遞到iframe中,您可以在這裏看看http://stackoverflow.com/questions/1663396/passing-url-parameters-to-iframe-using-jquery-or-javascript – Uri 2011-09-19 07:36:38

0

進出口仍然對於新手到FB連接和全過程,但我希望把我的2美分,我都看到了。一些網站嚴格建立在擁有FB的用戶上,因此他們登錄或不登陸FB適用於我提到的特定網站。我注意到,如果我在FB上登錄並在過去與這些站點連接,那麼我將自動登錄到所述站點,如果我沒有登錄,則應用相同的邏輯。

這就是說,我認爲這意味着FB有一個可識別的cookie可以在某個地方檢測到,如果檢測到可以在腳本中使用它,以使用戶自動登錄超過3600分。我從twitter和linkedin瞭解到,他們擁有用戶身份驗證令牌,可以識別每個最終可以存儲在數據庫中的用戶,並在以後重複使用。因此,我想也許您希望通過FB來了解更多信息,因爲我確信必須FB也是如此。在存儲與用戶關聯的令牌時,如果您發現前面提到的cookie已找到,那麼請檢查該驗證令牌。對不起,如果這沒有什麼意義我在這裏運行煙霧。如果我對FB的東西更好,我會盡力提供更多幫助,但我處於理解如何與FB和非fb站點交互的基本階段。

+0

這不是使用客戶端的流量通過JavaScript來自動登錄的問題。我遇到的情況如下:用戶來到我們的網站。 3600秒後,他/她在該頁面提交表單,但會話已過期,我們的腳本無法識別用戶是誰。如果我們將用戶重定向到自動登錄頁面,那麼在自動重新登錄後我們無法獲得POST數據。 – benck 2011-05-25 09:49:48

+0

好的,所以另一種選擇可能是,儘管它的本質與你試圖在說話方面達到的目的相反。通常情況下,您會在一小時不活動後假設用戶已經走開,失去動力,正在觀看電影,無論如何。有了它,他們可以在公共電腦,這就是爲什麼它過期的開始。這就是說,爲什麼不在一個具有活動性的重置計時器中,它從3600開始倒數​​到0,當它達到0時,就會自動將它們重定向到登錄,並顯示一條消息,指出由於不活動而退出登錄。這樣,你不打一場艱苦的戰鬥,讓他們在 – chris 2011-05-25 11:39:34

0

在保持客戶端流程的同時,您可以使用Facebook PHP SDK(see on github)來處理用戶會話。

$facebook = new Facebook(...); 

// Get the User ID 
$user = $facebook->getUser(); 

$user not null表示用戶登錄Facebook並進行身份驗證。你不再需要你在這裏給出的PHP(get_facebook_cookie和東西):它都包含在Facebook PHP SDK中。對你來說應該夠了。


更進一步:如果您想爲該用戶進行API調用。

$user非空並不意味着您擁有該用戶的有效訪問令牌。測試您是否擁有有效訪問令牌的一種方法是嘗試進行API調用:

$isvalid; 

try { 
    $facebook->api('/me'); 
    $isvalid = true; 
} catch (FacebookApiException $e) { 
    $isvalid = false; 
} 
+0

謝謝,但它並沒有幫助。當facebook的訪問令牌(cookie)過期時,它表示沒有連接。 – benck 2011-05-27 11:53:50

+0

如果訪問令牌過期,是不是因爲用戶註銷了Facebook?在這種情況下,您可以讓他登錄並繼續進行API調用。你知道offline_access許可嗎? Facebook發出永不過期的訪問令牌。可以幫助你。 – Quentin 2011-05-27 12:01:59

+2

用戶仍在Facebook內,但Cookie即將過期。我考慮過offline_access,但這不是我需要的。由於我的服務器上的帳戶會話過期,我不知道客戶是誰。不過,我可以保存離線訪問cookie來解決問題,但不是一個好的解決方案。 – benck 2011-05-27 13:25:15