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

Мое приложение простое, оно подключается к 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