Код php-клиента Google api не возвращает токен обновления


Я пытался получить токен обновления из google api, используя "код" клиента google javascript, который google возвращает со стороны клиента. Он возвращает мне код, который я отправляю на серверную сторону. Теперь со стороны сервера я отправляю код для получения токена обновления и токена доступа с помощью с помощью google-api-php-клиента с помощью этого вызова:

https://www.googleapis.com/oauth2/v4/token

Хотя я использую тот же код с google playground, я также получаю ответ с помощью токена обновления, но я не получаю его от своего собственного сервер.. Это код

public function getRefreshToken($code)
{
    $client = new Google_Client();
    $client->setClientId(config('services.google.client_id'));
    $client->setClientSecret(config('services.google.client_secret'));
    $client->setRedirectUri('postmessage');
    $client->setScopes(config('services.google.scopes'));
    $client->setAccessType("offline");
    $client->setApprovalPrompt("force");
    dd($client->authenticate($code));
    dd($client->getRefreshToken());
    return ;
}

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

access_token :"xxxxxxxxxxxxxxxxxxxxxx"
created:1510242052
expires_in:3598
id_token:"xxxxxxxx"
token_type:"Bearer"
Author: Syed Abdur Rehman Kazmi, 2017-11-09

1 answers

Ваш php-код выглядит для меня нормально. Я подозреваю, что в этом может быть виноват ваш интерфейс javascript, в частности ссылка на Google, которую он создает. Создает ли код авторизации токен обновления при погашении, частично зависит от того, какие параметры включены в начальную ссылку на Google.

Как подробно описано в этом ответе , клиентская библиотека javascript использует "поток на стороне клиента". Обычно в интерфейсном приложении вы указываете response_type=token, но если вы укажете response_type=code, вместо этого, вы получите code обратно. Но при погашении этот code не создаст токен обновления.

Например, ссылка, созданная интерфейсной библиотекой javascript, может выглядеть так:

https://accounts.google.com/o/oauth2/v2/auth?client_id=7xxxxxxxxxxx-xxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:8080/oauth2callback.php&response_type=code&scope=profile

Ваш сервер может активировать code, который возвращается, но ответ не будет включать маркер обновления. Это сделано специально.

Одним из способов получить code, который имеет право на токены обновления, было бы использовать серверную клиентскую библиотеку PHP для создания ссылки, а не клиентская библиотека javascript. $client->createAuthUrl() построит ссылку следующим образом:

Https://accounts.google.com/o/oauth2/auth?response_type=code&access_type=offline&client_id=7xxxxxxxxxx-hxxxxxxxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2callback.php&state&scope=profile&approval_prompt=force

Этот игрушечный пример создает ссылку таким образом и действительно получает токены обновления.

Обратите внимание на добавление из access_type=offine и approval_prompt=force. После успешной аутентификации перенаправление в этом случае включает в себя code, который действительно предоставляет токен обновления при погашении.

Игровая площадка OAuth 2.0 создает начальную ссылку, содержащую access_type=offline и prompt=consent, которая также создает код, который можно использовать для токена обновления.

Если это не поможет, возможно, вы могли бы обновить вопрос ссылкой на Google, которую создает ваш интерфейс? (С отредактированным идентификатором клиента, конечно)

 7
Author: Mike Patrick, 2017-11-11 23:46:05