1

參考: https://developers.facebook.com/docs/howtos/login/extending-tokens/的Facebook SDK訪問令牌會話過期太早

狀態:

默認情況下,大多數的訪問令牌有一個有限的有效期通常爲約1至2小時之久。爲了在到期時間後繼續使用這些令牌,需要對其進行擴展。

那麼爲什麼在facebook php sdk中給出的所有例子只有幾分鐘後登錄過期,之後需要新的登錄?

感謝

編輯

這是一個例子的代碼(https://github.com/facebook/facebook-php-sdk/blob/master/examples/with_js_sdk.php

<?php 

require '../src/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => '344617158898614', 
    'secret' => '6dc8ac871858b34798bc2488200e503d', 
)); 

// See if there is a user from a cookie 
$user = $facebook->getUser(); 

if ($user) { 
    try { 
    // Proceed knowing you have a logged in user who's authenticated. 
    $user_profile = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>'; 
    $user = null; 
    } 
} 

?> 
<!DOCTYPE html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <body> 
    <?php if ($user) { ?> 
     Your user profile is 
     <pre> 
     <?php print htmlspecialchars(print_r($user_profile, true)) ?> 
     </pre> 
    <?php } else { ?> 
     <fb:login-button></fb:login-button> 
    <?php } ?> 
    <div id="fb-root"></div> 
    <script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId: '<?php echo $facebook->getAppID() ?>', 
      cookie: true, 
      xfbml: true, 
      oauth: true 
     }); 
     FB.Event.subscribe('auth.login', function(response) { 
      window.location.reload(); 
     }); 
     FB.Event.subscribe('auth.logout', function(response) { 
      window.location.reload(); 
     }); 
     }; 
     (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 
    </body> 
</html> 
+0

您可以發佈您用於檢索訪問令牌的代碼嗎? –

+0

剛剛更新了一個片段的問題;) –

回答

2

我遇到了這個太最近。我認爲這與/me有關,所以我嘗試將它更改爲/user_id。下面是我使用的代碼:

require_once 'facebook-php/src/facebook.php'; 

$facebook = new Facebook(array(
    'appId' => '13********', 
    'secret' => '7a***********', 
)); 

$userId = $facebook->getUser(); 
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head profile="http://gmpg.org/xfn/11"> 
<body> 
<div id="fb-root"></div> 
<script> 
    window.fbAsyncInit = function() { 
     FB.init({ 
     appId  : '13**********', // App ID 
     status  : true, // check login status 
     cookie  : true, // enable cookies to allow the server to access the session 
     xfbml  : true // parse XFBML 
     }); 
    FB.Event.subscribe('auth.login', function(response) { 
     window.location.reload(); 
    }); 
    }; 
    (function(d){ 
     var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; 
     if (d.getElementById(id)) {return;} 
     js = d.createElement('script'); js.id = id; js.async = true; 
     js.src = "//connect.facebook.net/en_US/all.js"; 
     ref.parentNode.insertBefore(js, ref); 
    }(document)); 
    </script> <? 
if ($userId) { 
    $userInfo = $facebook->api('/' . $userId); 
?> 
<img src="http://graph.facebook.com/<?php echo $userId; ?>/picture" align="left" width="24px" height="24px" style="padding: 2px 10px 2px 5px"> <div style="margin:0 0 0 0; padding:0 0 0 0; display:inline; height:24px; line-height:28px"><b>Hi there, <?php echo $userInfo['name']; ?>!</b></div> 
<? } else { ?> 
    <div class="fb-login-button" style="display:inline; position:relative; top:3px" scope="email,user_birthday,publish_stream,offline_access"></div> 
<? } ?> 
</body> 
</html> 

該代碼工作知府,我只要他們簽署了Facebook的他們拿出在網站上。

+0

此外,一定要更新到最新的facebook-php-sdk,幾個月前它也有一個錯誤,這也導致了這個問題。 –

+0

我不明白這一點。如果y調用/ user_id而不是/我,你將獲得更長的令牌?這很奇怪! 無論如何,我看你也使用事件auth.login,所以你可能會對我報告的這個bug感興趣:https://developers.facebook.com/bugs/524245490930206 –

+0

是的,我不知道爲什麼使用user_id而不是我的作品,但它已經解決了我的問題與長期居住的會議。另外,看看你的bug,我在授權我的應用時在網站上使用它,而不一定當他們登錄Facebook時。像這樣使用它,我從來沒有遇到任何問題。 –

相關問題