Получить токен обновления google api

Я не могу получить свой токен обновления с моим кодом. Я могу получить только свой токен доступа, тип токена и т.д. Я прошел некоторые уроки, например, поставил 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.

Ответ 1

Обнаружено добавлением этого параметра в параметры вашего URL

approval_prompt = сила

Ответ 2

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

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

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

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

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

Ура,

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

Ответ 3

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

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

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

Ответ 4

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

$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

Ответ 5

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

Поток полномочий имеет два шага.

  • Получить код авторизации с помощью https://accounts.google.com/o/oauth2/auth? URL.

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

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

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

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

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

Ответ 6

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

Итак, вы можете получить referh_token - это некоторые сценарии, не все.

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

Ответ 7

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

Ответ 8

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

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

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