Мое приложение простое, оно подключается к API Google+ для аутентификации пользователя, и в случае успеха он извлекает электронную почту пользователя и затем выполняет серию операций по данной базе данных на основе полученного электронного письма.
Моя основная проблема заключается в том, что каждый час мой токен доступа истекает, и я, похоже, не знаю, как его «обновить». Я получаю следующую ошибку, которая, как мне кажется, ожидается:
The OAuth 2.0 access token has expired, and a refresh token is not available.
В настоящее время я храню токен доступа в базе данных, и поэтому я могу получить, если необходимо. Мой единственный вопрос – как я могу использовать этот токен, чтобы получить новый?
Вау, мне потребовалось значительно больше времени, чтобы понять это, и ответы там казались мне совершенно неполными.
Прежде чем начать, пожалуйста, имейте в виду, что этот ответ предполагает, что вы используете последнюю библиотеку PHP API Google, начиная с 26 мая 2014 года .
1 – Убедитесь, что тип доступа, к которому обращаются ваши приложения, offline
. refresh_token
не 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
действия 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: если значение является силовым, пользователь видит страницу согласия, даже если ранее они дали согласие на ваше приложение для данного набора областей. Это, в свою очередь, гарантирует, что для каждой авторизации предоставляется refresh_token
.
Полный пример здесь: http://pastebin.com/jA9sBNTk