Facebook已經刪除了offline_access令牌功能,現在令牌必須在用戶訪問您的網站時保持活躍狀態。如何使用PHP更新/擴展Facebook訪問令牌?
說別人已經給你的網站訪問,你有一個令牌存儲他們。您將使用Facebook的PHP庫來更新該令牌的代碼是什麼?
Facebook已經刪除了offline_access令牌功能,現在令牌必須在用戶訪問您的網站時保持活躍狀態。如何使用PHP更新/擴展Facebook訪問令牌?
說別人已經給你的網站訪問,你有一個令牌存儲他們。您將使用Facebook的PHP庫來更新該令牌的代碼是什麼?
您可擴展標記方式如下:從用戶
原始方案
現在你有令牌做你想要的東西長達60天。最多,因爲用戶可以更改密碼,取消授權應用程序等,令牌將變得無效。你可以做什麼來擴展令牌是每個用戶進入你的頁面,你可以檢查他們是否通過JavaScript登錄,如果他們是,做一個Ajax調用你的服務器擴展現有令牌從60天今天。您可以撥打任意數量的電話,只有第一個電話有效。下面是我如何做到這一點:在負載情況下的某處
在你的頁面,添加類似:
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
這將獲得一個新的客戶端訪問令牌的用戶,併發送那麼服務器
服務器可以採取的令牌並換取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天內這隻會延長令牌。如果不是,則需要再次提示權限。
感謝您的回答。而不是使用CURL,是不是有辦法使用他們提供的Facebook自己的類來做到這一點? – 2012-04-09 02:19:27
@Click Upvote,可能是我嘗試着使用FB類並做了api - >('/ oauth/access_token,'get',$ data)和各種排列,但由於某種原因沒有收回任何數據。沒有時間通過捲曲來弄清楚如此欺騙。 FB類也做CURL,所以我相信這只是我的一些語法錯誤。如果你知道,讓我知道:)我會很感激 – 2012-04-09 14:13:45
Facebook的PHP SDK(v.3.2.2)有一個方法來實現這一目標:Base_Facebook :: setExtendedAccessToken() – Lucia 2013-08-15 18:55:48
更新
是@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/
「您需要讓用戶在60天內再次進行重新驗證以獲取新令牌。」 - - 不。只要有'publish_stream'允許 - 你不需要用戶的令牌。直到用戶從應用程序列表中刪除應用程序 - 即使在100年後,您也可以發佈消息。所以,不,沒有理由堅持任何令牌除了應用程序密鑰和祕密 – zerkms 2012-04-05 09:02:04
感謝您更正@zerkms – 2012-04-05 10:00:11
只是回答我的問題,我如何續訂令牌,這不是關於流發佈 – 2012-04-05 13:50:25
這裏是什麼即時通訊目前正在做
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;
}
試過這個......它給了一個與傳遞的不同令牌,但發佈日期和到期日期相同(使用fb調試器)。只是以爲別人會想知道。 – ppetree 2013-08-04 22:38:35
@ppetree也許你正試圖重新擴展已經擴展的訪問令牌?每次用戶進行身份驗證時,我通常都會將新的訪問令牌傳遞給此函數。 – Kugutsumen 2013-08-05 05:49:08
問題是,擴展令牌據說會在60天后到期,我不希望用戶必須重新進行身份驗證......這似乎很荒謬。在我的情況下,用戶正在發佈到我的網站,我們張貼到fb並代表他們發送推文。 – ppetree 2013-08-09 18:05:55
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
你用什麼令牌?如果您擁有足夠的權限 - 您不需要檢索和存儲用戶會話令牌,只需使用應用程序令牌 – zerkms 2012-04-05 02:31:44
@zerkms如果用戶單擊以在我的網站上共享他的個人資料中的故事,那麼我想使用Ajax將故事發布在他的FB個人資料中,而不必每次都將他重定向到Facebook。 – 2012-04-05 02:33:50
然後您只需檢索'publish_stream'權限(http://developers.facebook.com/docs/authentication/permissions/#extended_perms,請參閱說明)。只要你有它 - 你可以發佈更新,沒有用戶的標記 – zerkms 2012-04-05 02:36:29