2012-06-05 70 views
15

基本問題:我希望我的應用能夠調用Facebook圖表api關於授權用戶的權限,即使用戶是遠。例如,我希望用戶(A)授權應用程序,然後我希望用戶(B)能夠使用該應用程序查看有關用戶(A)的朋友的信息。具體來說:「工作」字段。是的,我正在請求這些擴展權限(user_work_history,friends_work_history等)。目前我的應用程序可以訪問已登錄用戶的朋友的工作記錄,但不能訪問任何朋友的工作記錄其他應用程序的用戶。Facebook PHP SDK:現在已經棄用「offline_access」訪問令牌

這是我已經知道:

  • 添加offline_access的範圍參數是舊的方式,它 不再起作用。
  • 新方法是用「長命」訪問令牌, 描述爲here。這些持續60天。
  • 我需要交換一個正常的訪問令牌來獲得新的擴展令牌。 FB文檔說:

    https://graph.facebook.com/oauth/access_token
    CLIENT_ID = APP_ID & client_secret = APP_SECRET & grant_type = fb_exchange_token & fb_exchange_token = EXISTING_ACCESS_TOKEN

這裏就是我不知道(我希望你能告訴我): 如何使用Facebook PHP SDK獲得擴展(又名「長壽命」)訪問令牌嗎?目前,我的代碼如下所示:

$facebook->getAccessToken(); 

有沒有這樣的事情,因爲這?:

$facebook->getExtendedAccessToken(); 

如果不是,這是我應該做的?

$accessToken = $facebook->getAccessToken(); 
$extendedAccessToken = file_get_contents("https://graph.facebook.com/oauth/access_token?    
    client_id={$appId}& 
    client_secret={$secret}& 
    grant_type=fb_exchange_token& 
    fb_exchange_token={$accessToken}" 
    ); 

我試過了,它不起作用。我得到這個錯誤:

Warning: file_get_contents(https://graph.facebook.com/oauth/access_token? client_id=#######& client_secret=#########& grant_type=fb_exchange_token& fb_exchange_token=##########) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request in /... 

如果我切換到FQL而不是圖形api,它工作嗎?我已經多次閱讀Facebook文檔,但PHP sdk沒有完整記錄,我找不到任何應該如何工作的例子。

+1

答案的已經是你鏈接的頁面上 - 閱讀一遍,仔細... – CBroe

+0

我想我知道你指的是什麼,我更新了問題以顯示我嘗試過的(失敗)。請告訴我,如果你在談論別的事情。 – emersonthis

+0

如果您使用SDK,爲什麼使用file_get_contents?只需使用Facebook :: api就可以對Graph API發出請求。 – CBroe

回答

29

我終於明白了我自己的想法。答案相當反高潮。看來新創建的應用程序會自動獲得60天的訪問令牌。我不確定這是否取決於在應用設置的「遷移」部分中啓用「顯示offline_access」設置。保持安全。

所以在寫這篇的時候,你可以使用PHP SDK如下:$facebook->getAccessToken();

(原因如預期被無關的訪問令牌的到期我的應用程序不能正常工作)

還有一兩件事,要獲得長期的訪問令牌使用PHP SDK,你應該叫$facebook->setExtendedAccessToken();$facebook->getAccessToken();

+0

我正在使用較老的sdk。它沒有你提到的setExtendedAccessToken函數,所以我意識到我應該切換到最新版本。現在,它的工作,謝謝! – shaharsol

+2

我對此很生氣..我有一個疑問: 你這樣做是因爲你想訪問用戶配置文件,即使他沒有登錄,對不對?但是當「延長」的60天持久性標記到期時會發生什麼?用戶是否需要重新驗證..? 不是一個很好的經驗,我想.. – AldoB

+0

大聲笑 - 我想這解釋了爲什麼一切正常工作,直到我試圖創建一個新的應用程序,然後從該生成的令牌! (隨着舊應用程序,我沒有到期,與新的應用程序,我得到60天!) – Brad

22

在過去的Facebook PHP SDK 3.2.0你有一個新的功能setExtendedAccessToken() ,你必須之前調用

像這樣:

$user = $facebook->getUser(); 
$facebook->setExtendedAccessToken(); //long-live access_token 60 days 
$access_token = $facebook->getAccessToken(); 
10

其實新創建的應用程序,如果你使用的是服務器端調用只能得到60天的訪問令牌自動。如果您在問題中使用客戶端端點,則即使是新的應用程序,最初仍會收到短期標記。請參閱:https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

我有和使用新端點時一樣的HTTP/1.1 400錯誤請求錯誤,問題在於如果您複製了Facebook準確提供的代碼並將其粘貼到您的應用中,則實際上有空格在params之間,這意味着url中有不必要的空格,並且在傳遞到file_get_contents()時它不會被正確調用,即使它在瀏覽器中粘貼時工作正常。這花了我太多時間才弄清楚。希望這可以幫助別人!這裏是我完整的工作代碼來獲取擴展的訪問令牌出了新的端點(與你的價值觀取代X的):

$extend_url = "https://graph.facebook.com/oauth/access_token?client_id=xxxxxxxxxxxx&client_secret=xxxxxxxxxxxxxxxxxxxxxx&grant_type=fb_exchange_token&fb_exchange_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 

$resp = file_get_contents($extend_url); 

parse_str($resp,$output); 

$extended_token = $output['access_token']; 

echo $extended_token; 
+0

我無法驗證這一點,但它是我在問題中看到的第一個問題 – acSlater