Используйте Маркер обновления OAuth для получения нового маркера доступа - API Google
Мое приложение простое, оно подключается к API Google+ для аутентификации пользователя, и в случае успеха оно извлекает электронную почту пользователя , а затем выполняет ряд операций с данной базой данных на основе полученной электронной почты.
Моя главная проблема заключается в том, что каждый час срок действия моего токена доступа истекает, и я, похоже, не знаю, как его "обновить". Я получаю следующую ошибку, которая, как я полагаю, ожидается:
The OAuth 2.0 access token has expired, and a refresh token is not available.
В настоящее время я храню маркер доступа в базе данных, и я могу поэтому извлекайте, если это необходимо. Мой единственный вопрос заключается в том, как мне использовать этот токен, чтобы получить новый?
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