2016-09-01 3 views
0

Я использую Google Таблицы API с PHP и последовал краткое руководство, которые можно найти здесь https://developers.google.com/sheets/quickstart/phpRefreshToken Не клеится отправить обратно после того, как я получаю новый токен Google листы API

Когда я разрешаю правильно и хранить следовать JSon файлу в speicfied пути

{ 
    "access_token": "xxxxxxx", 
    "token_type": "Bearer", 
    "expires_in": 3600, 
    "refresh_token": "xxxxxx", 
    "created": 1472731452 
} 

После этого срока следующего сработали в моем коде

if ($client->isAccessTokenExpired()) { 
    $client->fetchAccessTokenWithRefreshToken(
     $client->getRefreshToken() 
    ); 

    $this->filesystem 
     ->put(
      self::CREDENTIALS, 
      json_encode($client->getAccessToken()) 
     ); 
} 

Теперь мой есть sue - это когда этот код запускается, он обновит мой файл примерно так:

{ 
    "access_token": "xxxxxxx", 
    "token_type": "Bearer", 
    "expires_in": 3600, 
    "created": 1472731452 
} 

Как вы видите, больше нет токенов обновления. По истечению этого маркеров я начала получать следующее сообщение об ошибке

[LogicException] 
refresh token must be passed in or set as part of setAccessToken 

Что perfactly понятно, потому что у меня нет обновления маркеров там больше.

Мой вопрос: почему токен обновления удаляется? Я называю те же методы, что и один в кратком руководстве https://developers.google.com/sheets/quickstart/php

я говорю specificaly об этой части в руководстве

// Refresh the token if it's expired. 
if ($client->isAccessTokenExpired()) { 
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); 
    file_put_contents($credentialsPath, json_encode($client->getAccessToken())); 
} 

ответ

2

Ваш refresh token expired, потому что продолжительность жизни установлена ​​в вашем коде только 3600 секунд/1 час.

{ 
"access_token": "xxxxxxx", 
"token_type": "Bearer", 
"expires_in": 3600, //refresh_token good for 1 hour 
"refresh_token": "xxxxxx", 
"created": 1472731452 
} 

Using a refresh token

Маркер обновления получен в автономном режиме сценариев во время первого обмена кодом авторизации. В этих случаях ваше приложение может получить новый токен доступа, отправив токен обновления на сервер авторизации Google OAuth 2.0.

Чтобы получить новый токен доступа таким образом, ваше приложение отправит запрос POST POST на https://www.googleapis.com/oauth2/v4/token. Запрос должен включать в себя следующие параметры:

Такой запрос будет выглядеть следующим образом:

POST /oauth2/v4/token HTTP/1.1 
Host: www.googleapis.com 
Content-Type: application/x-www-form-urlencoded 

client_id=8819981768.apps.googleusercontent.com& 
client_secret={client_secret}& 
refresh_token=1/6BMfW9j53gdGImsiyUH5kU5RsR4zwI9lUVX-tqf8JXQ& 
grant_type=refresh_token 

Проверить это SO thread для дополнительной ссылки. Надеюсь, это поможет!

+0

Да, это намного лучше, спасибо! Я только что снова привязал токен обновления, прежде чем сохранить его :) – Steve

2

refresh_token предоставляется только при первой авторизации от пользователя. Последующие авторизации, такие как вид, который вы выполняете при тестировании интеграции OAuth2, больше не возвращают refresh_token. :)

  1. Перейдите в настройки безопасности своей учетной записи: https://www.google.com/settings/u/1/security.
  2. Нажмите кнопку «Редактировать» рядом с «Авторизация приложений и сайтов».
  3. Затем нажмите «Отменить доступ» рядом с вашим приложением.
  4. Следующий запрос OAuth2, который вы сделаете, вернет refresh_token.

В качестве альтернативы, вы можете добавить параметр запроса prompt=consent к OAuth редиректа (см OAuth 2.0 for Web Server Applications страницу компании Google).

Это побудит пользователя снова авторизовать приложение и всегда будет возвращать refresh_token.

 Смежные вопросы

  • Нет связанных вопросов^_^