Получить обновление токена 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
,
Ура,
Это 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
у нас не работает
Привет, я выполнил следующие шаги и смог получить токен обновления.
Процесс авторизации состоит из двух этапов.
Это получить код авторизации с помощью
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": "код авторизации",
Таким образом, в вашей первой попытке после авторизации разрешений вы сможете получить токен 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