2012-04-05 124 views
12

Facebook已經刪除了offline_access令牌功能,現在令牌必須在用戶訪問您的網站時保持活躍狀態​​。如何使用PHP更新/擴展Facebook訪問令牌?

說別人已經給你的網站訪問,你有一個令牌存儲他們。您將使用Facebook的PHP庫來更新該令牌的代碼是什麼?

+1

你用什麼令牌?如果您擁有足夠的權限 - 您不需要檢索和存儲用戶會話令牌,只需使用應用程序令牌 – zerkms 2012-04-05 02:31:44

+0

@zerkms如果用戶單擊以在我的網站上共享他的個人資料中的故事,那麼我想使用Ajax將故事發布在他的FB個人資料中,而不必每次都將他重定向到Facebook。 – 2012-04-05 02:33:50

+0

然後您只需檢索'publish_stream'權限(http://developers.facebook.com/docs/authentication/permissions/#extended_perms,請參閱說明)。只要你有它 - 你可以發佈更新,沒有用戶的標記 – zerkms 2012-04-05 02:36:29

回答

8

您可擴展標記方式如下:從用戶

原始方案

  • 應用程式所要求的權限
  • 您提示用戶登錄/授予權限
  • 你得到用戶的令牌(短命的)使用,並通過捲曲或其它方式對一個60天的交流grant_type = fb_exchange_token
  • 你堅持下去的令牌

現在你有令牌做你想要的東西長達60天。最多,因爲用戶可以更改密碼,取消授權應用程序等,令牌將變得無效。你可以做什麼來擴展令牌是每個用戶進入你的頁面,你可以檢查他們是否通過JavaScript登錄,如果他們是,做一個Ajax調用你的服務器擴展現有令牌從60天今天。您可以撥打任意數量的電話,只有第一個電話有效。下面是我如何做到這一點:在負載情況下的某處

  1. 在你的頁面,添加類似:

    FB.getLoginStatus(function (response) { 
        if (response.status === 'connected') { 
         $.ajax({ 
          type: "POST", 
          async: false, 
          url: YOUR_URL, 
          dataType: "text", 
          data: {token : response.authResponse.accessToken } 
         }); 
        } 
    }); 
         //rest of jquery ajax call here 
    

這將獲得一個新的客戶端訪問令牌的用戶,併發送那麼服務器

  1. 服務器可以採取的令牌並換取60天的一個

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".FACEBOOK_CLIENT_ID."&client_secret=".FACEBOOK_SECRET."&grant_type=fb_exchange_token&fb_exchange_token=".$token; 
    
    $c = curl_init(); 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($c, CURLOPT_URL, $token_url); 
    $contents = curl_exec($c); 
    $err = curl_getinfo($c,CURLINFO_HTTP_CODE); 
    curl_close($c); 
    
    $paramsfb = null; 
    parse_str($contents, $paramsfb);   
    

參考:

https://developers.facebook.com/roadmap/offline-access-removal/

如果用戶又回到你的網站在60天內這隻會延長令牌。如果不是,則需要再次提示權限。

+0

感謝您的回答。而不是使用CURL,是不是有辦法使用他們提供的Facebook自己的類來做到這一點? – 2012-04-09 02:19:27

+0

@Click Upvote,可能是我嘗試着使用FB類並做了api - >('/ oauth/access_token,'get',$ data)和各種排列,但由於某種原因沒有收回任何數據。沒有時間通過​​捲曲來弄清楚如此欺騙。 FB類也做CURL,所以我相信這只是我的一些語法錯誤。如果你知道,讓我知道:)我會很感激 – 2012-04-09 14:13:45

+1

Facebook的PHP SDK(v.3.2.2)有一個方法來實現這一目標:Base_Facebook :: setExtendedAccessToken() – Lucia 2013-08-15 18:55:48

1

更新

是@zerkms是正確的,如果應用程序有權限不需要的access_token。

With this permission, you can publish content to a user's feed at any time. However, please note that Facebook recommends a user-initiated sharing model. Please read the Platform Policies to ensure you understand how to properly use this permission. Note, you do not need to request the publish_stream permission in order to use the Feed Dialog, the Requests Dialog or the Send Dialog.

所有擴展權限也有類似的特權:https://developers.facebook.com/docs/authentication/permissions/

+0

「您需要讓用戶在60天內再次進行重新驗證以獲取新令牌。」 - - 不。只要有'publish_stream'允許 - 你不需要用戶的令牌。直到用戶從應用程序列表中刪除應用程序 - 即使在100年後,您也可以發佈消息。所以,不,沒有理由堅持任何令牌除了應用程序密鑰和祕密 – zerkms 2012-04-05 09:02:04

+0

感謝您更正@zerkms – 2012-04-05 10:00:11

+0

只是回答我的問題,我如何續訂令牌,這不是關於流發佈 – 2012-04-05 13:50:25

0

這裏是什麼即時通訊目前正在做

public function setExtendAccessToken($accessToken = NULL) { 

enter code here 
    if(!$accessToken) return; 

    $graphUrl = 'https://graph.facebook.com/oauth/access_token?client_id='.$facebookAppId. 
       '&client_secret='.$facebookSecret. 
       '&grant_type=fb_exchange_token&fb_exchange_token='.$accessToken; 
    $accessToken = @file_get_contents($graphUrl); 
    parse_str($accessToken); //get the access_token param in the string and would be named $access_token 
    if(!$access_token) $access_token = $accessToken; //if cannot be extended then just return the access token with 2 hours expiry 
    return $access_token; 
} 
+0

試過這個......它給了一個與傳遞的不同令牌,但發佈日期和到期日期相同(使用fb調試器)。只是以爲別人會想知道。 – ppetree 2013-08-04 22:38:35

+0

@ppetree也許你正試圖重新擴展已經擴展的訪問令牌?每次用戶進行身份驗證時,我通常都會將新的訪問令牌傳遞給此函數。 – Kugutsumen 2013-08-05 05:49:08

+0

問題是,擴展令牌據說會在60天后到期,我不希望用戶必須重新進行身份驗證......這似乎很荒謬。在我的情況下,用戶正在發佈到我的網站,我們張貼到fb並代表他們發送推文。 – ppetree 2013-08-09 18:05:55

0
use Facebook\FacebookSession; 
use Facebook\GraphSessionInfo; 
use Facebook\FacebookRequest; 
use Facebook\GraphUser; 
use Facebook\FacebookRequestException; 
use Facebook\FacebookRedirectLoginHelper; 

    FacebookSession::setDefaultApplication('YOURAPPID', 'SECRET'); 

    $user_accessToken = $_COOKIE['access_token_facebook'] 

    $session = new FacebookSession($user_accessToken); 

    try { 
     $session->validate(); 
    } catch (FacebookRequestException $ex) { 
     // When Facebook returns an error 
     echo $ex->getMessage(); 
    } catch (\Exception $ex) { 
     // When validation fails or other local issues 
     echo $ex->getMessage(); 
    } 
    if ($session) { 
     // Exchange token for long token 
     $longToken = $session->getExchangeToken(); 
     // ... your other stuff 
    } 

編號: https://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens https://developers.facebook.com/docs/facebook-login/access-tokens#extending