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