Получить обновление токена 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.

10 ответов

Решение

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

approval_prompt= сила

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

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

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

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

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

Ура,

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

Это access_type=offline что ты хочешь.

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

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

Это полный код в 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

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

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

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

  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": "код авторизации",

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

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

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

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

вы можете получить контент в https://developers.google.com/identity/protocols/OAuth2WebServer.

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

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

authentication_prompt= сила была заменена на prompt=none|consent|select_account

Тем, кто использует клиентскую библиотеку API Google для PHP и ищет автономный доступ и токены обновления, будьте осторожны, поскольку на момент написания этой статьи в документах показаны неверные примеры.

в настоящее время отображается:

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
// offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');
// Using "consent" ensures that your application always receives a refresh token.
// If you are not using offline access, you can omit this.
$client->setApprovalPrompt("consent");
$client->setIncludeGrantedScopes(true);   // incremental auth

источник: https://developers.google.com/identity/protocols/OAuth2WebServer

Все это отлично работает - кроме ОДНОЙ штуки

$client->setApprovalPrompt("consent");

После некоторых рассуждений я изменил эту строку на следующую, и ВСЕ РАБОТАЛО

$client->setPrompt("consent");

Это имеет смысл, так как с помощью HTTP-запросов он был изменен с author_prompt = force на prompt = согласие. Таким образом, изменение метода установки с setApprovalPrompt на setPrompt следует естественному соглашению - НО ЭТО НЕ В ДОКУМЕНТЕ!!! По крайней мере, это я нашел.

Самый простой способ получить токен обновления и токен доступа - использовать игровую площадку oauth2. вы можете перейти по ссылке, чтобы использовать его

https://help.talend.com/r/Ovc10QFckCdvYbzxTECexA/EoAKa_oFqZFXH0aE0wNbHQ

Другие вопросы по тегам