2011-09-27 39 views
0

希望這應該是快速和容易的。Facebook PHP SDK - 必須在新瀏覽器會話期間重新進行身份驗證?

session_start(); 

include("facebook.php"); 

$facebook = new Facebook(array(
'appId'=>'xxxxx50274xxxxx', 
'secret'=>'xxxxxb932d62fbc6287feb18e5exxxxx', 
'cookie'=>true 
)); 

$fbuser = $facebook->getUser(); 

if (empty($fbuser)){ 
    $fbloginurl=$facebook->getLoginURL(); 
    echo "<html><body><a href='$fbloginurl'>Click</a></body></html> 
} else { 
    die("Authenticated"); 
} 

在這個例子中,我第一次點擊鏈接給應用程序的權限來訪問我的FB帳戶,一切正常。我可以不斷刷新頁面,並獲得「Authenticated」確認。

但是,每次我重新啓動瀏覽器(開始新會話)時,它都不會自動驗證應用程序,我必須再次單擊該鏈接。當然,只要我點擊鏈接,我會立即重定向回到源頁面,並顯示「Authenticated」確認。

有沒有什麼辦法可以在新的瀏覽器會話期間不必點擊認證鏈接並自動進行認證?我需要在沒有PHP Header指令的情況下執行此操作,因爲我希望用戶第一次授予應用程序的權限以通過手動點擊觸發。

我的FB登錄是持久性的(「保持登錄狀態」選項被選中)。

非常感謝您的幫助。

回答

0

將它與我的代碼進行比較,我看到的唯一區別是我檢查$ fbuser是否有效 - 如果它不是將我發送到登錄屏幕。我也在使用top.location.href。

// Login or logout url will be needed depending on current user state. 
if ($fbuser) { 
     $logoutUrl = $facebook->getLogoutUrl(); 
     } 
else { 
    $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions', 'canvas' => 1, 'fbconnect' => 0, 'redirect_uri'=>config_item('facebook_url').$pf)); 
    echo "<html><body><script> top.location.href='" . $loginUrl . "'</script></body></html>"; 
    exit(0); 
    } 

希望有幫助。

+0

約翰,我懷疑你有相同的「問題」,但你通過使用JS重定向解決它。這樣,它對最終用戶來說實際上是看不見的。但是,就我而言,我試圖明確避免任何自動重定向。 –

1

如果我正確理解您的場景(這不是iframe應用程序,那麼正確?),這完全取決於瀏覽器關閉時丟失網站會話cookie。一旦這個cookie消失了,沒有任何東西可以識別用戶到你的服務器端代碼,所以沒辦法知道用戶是否曾經授權過你的應用程序。

您需要找到一種持久標識用戶的方法,或者至少確定他已經授予了權限。最簡單的方法可能是在用戶首次通過身份驗證後設置自己的(永久)cookie。然後,無論何時會話cookie丟失,檢查永久性cookie的存在,如果它存在,做一個PHP重定向到Facebook(這對用戶是不可見的)。如果沒有cookie,就像現在一樣向用戶呈現HTML鏈接。

+0

這是一個很好的解決方法 - 謝謝! –

相關問題