Facebook PHP SDK: получение "долгоживущего" токена доступа теперь, когда "offline_access" устарел

ОСНОВНАЯ ПРОБЛЕМА:. Я хочу, чтобы мое приложение могло совершать вызовы на графике Facebook api для авторизованных пользователей, даже когда пользователь ушел.

Например, я хочу, чтобы пользователь (A) разрешил это приложение, а затем я хочу, чтобы пользователь (B) мог использовать приложение для просмотра информации о пользователях (A). В частности: поле "работа". Да, я запрашиваю эти расширенные разрешения (user_work_history, friends_work_history и т.д.). В настоящее время мое приложение имеет доступ к истории работы зарегистрированных пользователей, но не к любой из истории работы друзей других пользователей приложения.

Вот что я знаю уже:

  • Добавление параметра offline_access в параметр области - это старый способ, и он больше не работает.
  • Новый способ заключается в "долгоживущих" токенах доступа, описанный здесь. Они продолжаются 60 дней.
  • Мне нужно обменять обычный токен доступа, чтобы получить новый расширенный токен. В документации FB говорится:

    https://graph.facebook.com/oauth/access_token?
      client_id = APP_ID &   client_secret = APP_SECRET &ampы;   grant_type = fb_exchange_token &   fb_exchange_token = EXISTING_ACCESS_TOKEN

Вот что я не знаю (и я надеюсь, что вы мне скажете): Как получить расширенный токен доступа (aka "долгоживущий" ) с помощью PHP 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

Я, наконец, понял это сам. Ответ довольно анти-климатический. Похоже, что недавно созданные приложения автоматически получают токены доступа на 60 дней. Я не уверен, что это зависит от включения параметра "deticate offline_access" в разделе "Миграции" в настройках приложения. Оставьте его безопасным.

Итак, на момент написания этого, вы можете использовать SDK PHP следующим образом: $facebook->getAccessToken();

(Причина, по которой мое приложение не работает, как ожидалось, не связано с истечением срока доступа маркера доступа.)

Еще одно, чтобы получить долгоживущий токен доступа с помощью PHP SDK, вы должны называть $facebook->setExtendedAccessToken(); до $facebook->getAccessToken();

Ответ 2

В последнем Facebook PHP SDK 3.2.0 у вас есть новая функция setExtendedAccessToken() что вы должны позвонить до getAccessToken();

Вот так:

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

Ответ 3

На самом деле только что созданные приложения получают автоматически 60-дневный токен доступа, если вы используете вызов на стороне сервера. Если вы используете конечную точку на стороне клиента, как показано выше в вопросе, даже новые приложения по-прежнему будут получать краткосрочный токен изначально. см. https://developers.facebook.com/docs/roadmap/completed-changes/offline-access-removal/

У меня была ошибка HTTP-запроса с ошибкой HTTP/1.1 400, которая была у вас при использовании новой конечной точки, и проблема была в том, что если вы скопируете код Facebook, вы точно укажете его и вставьте в свое приложение, на самом деле есть пробелы между параметрами, что означает ненужные пробелы в 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;

Ответ 4

Выбранный ответ устарел. Ниже приведены инструкции Facebook по замене краткосрочного токена (предоставленного во внешнем интерфейсе) на долгосрочный токен (только для сервера):

https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/

Generate a Long-lived User or Page Access Token
You will need the following:

A valid User or Page Access Token
Your App ID
Your App Secret
Query the GET oath/access_token endpoint.

curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?  
    grant_type=fb_exchange_token           
    client_id={app-id}&
    client_secret={app-secret}&
    fb_exchange_token={your-access-token}" 

Sample Response
{
  "access_token":"{long-lived-access-token}",
  "token_type": "bearer",
  "expires_in": 5183944            //The number of seconds until the token expires
}