Получить обновление токена Google API - PullRequest
69 голосов
/ 20 января 2012

Я не могу получить свой токен обновления с моим кодом.Я могу получить только свой токен доступа, тип токена и т. Д. Я прошел некоторые уроки, такие как добавление access_type=offline в свой URL для входа в систему:

echo "<a href='https://accounts.google.com/o/oauth2/auth?" 
    . "access_type=offline&client_id=123345555.apps.googleusercontent.com& "
    . "scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/plus.me&response_type=code& "
    . "redirect_uri=http://www.sample.com/sample.php&state=/profile'>Google</a>";

и мои поля при получении токена доступа:

$fields=array(
    'code'=>  urlencode($authcode),
    'client_id'=> urlencode($clientid),
    'client_secret'=> urlencode($clientsecret),
    'redirect_uri'=> urlencode($redirecturi),
    'grant_type'=> 'authorization_code',
);

но я не могу получить refresh_token , только access_token , token_type , id_token и expires_in .

Ответы [ 8 ]

97 голосов
/ 20 января 2012

Выясните это, добавив это к своим параметрам URL

Approval_prompt = force

57 голосов
/ 19 апреля 2012

Если я могу расширить user987361 ответ:

Из автономного доступа часть документов OAuth2.0:

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

Итак, когда вы уже предоставили доступпоследующие запросы на grant_type из authorization_code не будут возвращать refresh_token, даже если access_type было установлено на offline в строке запроса на странице согласия.

Как указано вцитата выше, чтобы получить новый refresh_token после его получения, вам нужно будет отправить вашего пользователя обратно через приглашение, которое вы можете сделать, установив approval_prompt в force.

Приветствия,

PS Это изменение было также объявлено в блоге .

12 голосов
/ 04 апреля 2013

Это access_type=offline, что вы хотите.

Это вернет маркер обновления, когда пользователь впервые авторизует приложение. Последующие звонки не заставляют вас повторно утверждать приложение (approval_prompt=force).

Подробнее см .: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

9 голосов
/ 01 февраля 2015

Это полный код в PHP с использованием официального Google SDK

$client = new Google_Client();
## some need parameter
$client->setApplicationName('your application name');
$client->setClientId('****************');
$client->setClientSecret('************');
$client->setRedirectUri('http://your.website.tld/complete/url2redirect');
$client->setScopes('https://www.googleapis.com/auth/userinfo.email');
## these two lines is important to get refresh token from google api
$client->setAccessType('offline');
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grant offline access
6 голосов
/ 17 августа 2017

Для нашего приложения мы должны были использовать оба эти параметра access_type=offline&prompt=consent.approval_prompt=force не работает у нас

5 голосов
/ 29 сентября 2014

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

Поток авторизации состоит из двух этапов.

  1. Для получения кода авторизации с использованием https://accounts.google.com/o/oauth2/auth? URL.

    Для этого отправляется запрос на публикацию с предоставлениемследующие параметры.'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline' Приведенное выше, получит код авторизации.

  2. Получение AcessToken и RefreshToken с использованием https://accounts.google.com/o/oauth2/token? URL.Для этого отправляется почтовый запрос с указанием следующих параметров.

    "код": код, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "authorization_code",

Таким образом, в вашей первой попытке после авторизации разрешений вы сможете получить токен Refresh.Последующие попытки не предоставят токен обновления.Если вы хотите снова получить токен, отмените доступ в вашем приложении.

Надеюсь, это поможет кому-то приветствовать :)

4 голосов
/ 10 июля 2015

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

Таким образом, вы можете получить referh_token с некоторыми сценариями, но не со всеми.

вы можете иметь содержимое в https://developers.google.com/identity/protocols/OAuth2WebServer#offline .

0 голосов
/ 09 апреля 2019

С марта 2016 года используйте prompt=consent для регенерации токена обновления API Google.

Как указано в https://github.com/googleapis/oauth2client/issues/453,

Approve_prompt = force был заменен на prompt=none|consent|select_account

...