2011-08-20 147 views
3

我使用Facebook's PHP SDK登錄用戶到我的網站,像這樣:使用PHP或JavaScript Facebook SDK,我如何讓用戶登錄到我的網站?


<?php 
$facebook = new Facebook(array(
    "appId" => "myAppID", 
    "secret" => "mySecret", 
)); 

$user = $facebook->getUser(); 

if ($user) { 
    try { 
     // user is authenticated 
     $user_profile = $facebook->api("/me"); 
    } catch (FacebookApiException $ex) { 
     $user = null; 
    } 
} 

if ($user) { 
    $logoutURL = $facebook->getLogoutUrl(); 
    ?> 
    <img src="https://graph.facebook.com/<?php echo $user; ?>/picture" /> 
    <a href="<?php echo($logoutURL); ?>">Logout</a> 
    <pre><?php print_r($user_profile); ?></pre> 
    <?php 
} else { 
    ?> 
    <a href="<?php echo($loginURL); ?>">Login</a> 
    <?php 
} 
?> 

的問題是,當用戶返回到現場,他們不再登錄,並且需要重新登錄英寸

返回用戶是否可以保持登錄狀態?


更新:

我的精確解最終被JavaScript和PHP Facebook的軟件開發工具包的組合。

問題是cookie不用於存儲Facebook登錄信息 - PHP會話是(PHP會話cookie在瀏覽器關閉時會過期)。除此之外,除非您有離線訪問權限,否則訪問令牌將過期。換句話說,即使您將Facebook訪問令牌存儲在cookie中,它最終也會過期並且用戶將被註銷。

中的JavaScript我最終使用:

FB.init({ 
     appId: "myAppID", 
     cookie: true, // enable cookies to allow the server to access the session 
     xfbml: true, // parse XFBML 
     oauth: true // enable OAuth 2.0 
    }); 

    FB.Event.subscribe("auth.login", function(response) { 
     // a user logged in who was not previously logged in 
     window.location.refresh(true); // ideally modify the page with JS rather than refreshing 
    }); 

    FB.Event.subscribe("auth.logout", function(response) { 
     // a user logged out who was previously logged in 
     window.location.refresh(true); // ideally modify the page with JS rather than refreshing 
    }); 

    // check if the user is logged in or not, using the Facebook JS SDK 
    FB.getLoginStatus(null); 

當加載頁面時,看到了Facebook的JavaScript SDK檢查與Facebook用戶是否登錄如果用戶登錄,和餅乾尚未設置,它將被設置。然後,您可以刷新頁面(或者,理想情況下,使用JavaScript修改它),服務器將能夠使用常規PHP SDK(以及此問題中的第一段代碼)訪問cookie。

這是我在跨瀏覽會話進行永久登錄時找到的最佳方式。

回答

4

這裏有兩種情況。一個是驗證用戶,另一個是識別用戶。

當您使用任何Facebook API提供的登錄方法時,通常會發生什麼,他們會看到用戶是否有與Facebook會話。如果沒有,用戶將被提示登錄,以便您可以看到它是哪個用戶。在你的情況下,你希望用戶總是登錄到Facebook。這是不可行的,因爲你需要找出它是哪個用戶。您可以在用戶計算機上存儲一些識別細節的cookie。您需要擁有該用戶的離線權限,否則用戶將不得不使用API​​登錄以獲取新的access_token。

如果你想要我的建議,你應該只使用API​​的GetLoginStatus方法來檢查用戶是否有與Facebook會話。如果用戶未登錄Facebook,則要求他們登錄您的網站並不算太多。大多數使用Facebook的用戶都存儲了他們的登錄信息,以便他們在瀏覽器打開時總是會進行會話。

這將是最好的方法去做,因爲它不需要你問用戶離線權限,我想很多用戶不會給。如果由於某種原因,你不能使用這種方法,我建議獲得脫機許可,然後在其計算機上存儲一個沒有定時器的cookie,這樣它就不會被自動刪除。

對不起,我希望我有點幫助:)

+0

這是非常有用的,非常感謝你。 –

+0

對於任何人在將來閱讀:在我的問題的第二部分有更多的信息來實現這一點。 –

相關問題