Подтвердить что ты не робот

Используйте токен обновления OAuth для получения нового токена доступа - API Google

Мое приложение простое, оно подключается к Google+ API для аутентификации пользователя, и в случае успеха оно извлекает пользователя email, а затем выполняет серию операций по данной базе данных на основе электронной почты извлекаться.

Моя основная проблема заключается в том, что каждый час мой токен доступа истекает, и я, похоже, не знаю, как его "обновить". Я получаю следующую ошибку, которая, как я предполагаю, ожидается:

The OAuth 2.0 access token has expired, and a refresh token is not available.

В настоящее время я храню токен доступа в базе данных, и поэтому я могу получить, если необходимо. Мой единственный вопрос - как я могу использовать этот токен, чтобы получить новый?

4b9b3361

Ответ 1

Эй, мне потребовалось значительно больше времени, чтобы понять это, и ответы там казались мне совершенно неполными.

Прежде чем начать, пожалуйста, имейте в виду, что этот ответ предполагает, что с 26 мая 2014 года вы используете последнюю Библиотека API Google API.

1. Убедитесь, что тип доступа, который требуется вашим приложениям, составляет offline. A refresh_token не предоставляется в противном случае. От Google: это поле присутствует только в том случае, если access_type = offline включен в запрос кода авторизации.

$gClient->setAccessType('offline');

2 - После первого авторизации сохраните предоставленный refresh_token для дальнейшего доступа. Это можно сделать с помощью файлов cookie, базы данных и т.д. Я решил сохранить в базе данных:

$tokens = json_decode($gClient->getAccessToken()); /* Get a JSON object */
setRefreshToken($con, $tokens->refresh_token /* Retrieve form JSON object */);

3 - Проверьте, истек ли срок действия AccessToken, и запросите обновленный токен от Google, если это так.

if ($gClient->isAccessTokenExpired()) {    
  $refreshToken = getRefreshToken($con, $email); 
  $gClient->refreshToken($refreshToken);
}  

Где getRefreshToken извлекает ранее сохраненную refresh_token из нашей базы данных, а затем мы передаем это значение клиенту refreshToken.

Быстрое примечание:. Это означает, что если вы предварительно авторизировали свое приложение, вы, вероятно, не увидите ответ refresh_token, поскольку он предоставляется только при первом вызове authenticate. Поэтому вы можете перейти в https://www.google.com/settings/security и Отменить доступ к вашему приложению или добавить следующую строку, если создание объекта Client:

$gClient->setApprovalPrompt('force');

От Google: если значение является силовым, пользователь видит страницу согласия, даже если ранее они дали согласие на ваше приложение для данного набора областей. Это, в свою очередь, гарантирует, что на каждой авторизации предоставляется a refresh_token.

Полный пример здесь: http://pastebin.com/jA9sBNTk