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


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

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

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

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

Author: daniel_c05, 2014-05-27

1 answers

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

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

1 - Убедитесь, что тип доступа, который запрашивает ваше приложение, равен offline. 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 и Отменяют доступ к вашему приложению, или вы можете добавить следующую строку при создании объекта клиента:

$gClient->setApprovalPrompt('force');

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

Полный Образец Здесь: http://pastebin.com/jA9sBNTk

 16
Author: daniel_c05, 2014-05-27 04:15:37