Как обновить / расширить токены доступа к Facebook с помощью PHP?

Facebook удалил функцию токена offline_access, теперь токены должны обновляться всякий раз, когда пользователь посещает ваш сайт, чтобы поддерживать их активность.

Скажите, что кто-то уже предоставил вам доступ к вашему сайту, и у вас есть токен, хранящийся для них. Какой код вы бы использовали с библиотекой PHP Facebook, чтобы обновить этот токен?

Solutions Collecting From Web of "Как обновить / расширить токены доступа к Facebook с помощью PHP?"

Вы можете расширить свой токен следующим образом:

Оригинальный сценарий

  • Ваше приложение запрашивает разрешения у пользователя
  • Вы запрашиваете у пользователя права входа / разрешения
  • Вы получаете токен пользователя (недолговечный) и обмениваете его через CURL или другие средства на 60-дневный с использованием grant_type = fb_exchange_token
  • Вы сохраняете токен

Теперь у вас есть этот токен, чтобы делать то, что вы пожелаете, на срок до 60 дней. До, поскольку пользователь может сменить пароль, деактивировать приложение и т. Д., Токен станет недействительным. Что вы можете сделать, чтобы расширить токен, пользователь EVERY TIME подходит к вашей странице (-ам), вы можете проверить, вошли ли они в систему через javascript, и если да, сделайте ajax-вызов для вашего сервера, чтобы расширить существующий токен в течение 60 дней с Cегодня. Вы можете сделать столько звонков, сколько хотите, только первый из них действителен. Вот как я это делаю:

  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 дней. Если нет, вам нужно будет снова запросить разрешения.

обновленный

Да @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/

Вот что я сейчас делаю

 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; } 
 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