Как обновить/расширить токены доступа к Facebook с помощью PHP?
Facebook удалил функцию токена offline_access, теперь токены должны обновляться всякий раз, когда пользователь посещает ваш сайт, чтобы поддерживать их.
Скажите, что кто-то уже предоставил вам доступ к вашему сайту, и у вас есть маркер, хранящийся для них. Какой код вы бы использовали с библиотекой Facebook PHP, чтобы обновить этот токен?
Ответы
Ответ 1
Вы можете расширить свой токен следующим образом:
Оригинальный сценарий
- Ваше приложение запрашивает разрешения у пользователя
- Вы предлагаете пользователю войти в систему/предоставить разрешения
- Вы получаете токен пользователя (недолговечный) и обмениваете его через CURL или другие средства на 60-дневный с использованием grant_type = fb_exchange_token
- Вы сохраняете токен
Теперь у вас есть этот токен, чтобы делать то, что вы хотите с ним, на срок до 60 дней. До, поскольку пользователь может сменить пароль, деактивировать приложение и т.д., Токен станет недействительным. Что вы можете сделать, чтобы расширить токен, пользователь EVERY TIME подходит к вашей странице (-ам), вы можете проверить, вошли ли они в систему через javascript, и если да, сделайте ajax-вызов для вашего сервера, чтобы расширить существующий токен в течение 60 дней с Cегодня. Вы можете сделать столько звонков, сколько хотите, только первый из них действителен. Вот как я это делаю:
-
На вашей странице где-то во время события загрузки добавьте что-то вроде:
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 дней. Если нет, вам нужно будет снова запросить разрешения.
Ответ 2
Обновление
Да @zerkms прав, не требуется access_token, если у приложения есть разрешение.
With this permission, you can publish content to a user 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/
Ответ 3
Здесь то, что im в настоящее время делает
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;
}
Ответ 4
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
}
Ref:
https://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens
https://developers.facebook.com/docs/facebook-login/access-tokens#extending