Я хочу получить токен доступа от Google. Google API сообщает, что для получения токена доступа отправьте код и другие параметры на страницу создания токена, и ответом будет объект JSON, подобный следующему:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Однако я не получаю токен обновления. Ответ в моем случае:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Мухаммед Усман
источник
источник
Ответы:
Предоставляется
refresh_token
только при первой авторизации от пользователя. Последующие авторизации, такие как те, которые вы делаете при тестировании интеграции OAuth2, больше не вернутсяrefresh_token
. :)refresh_token
(при условии, что он также включает параметр запроса «access_type = offline»).Кроме того, вы можете добавить параметры запроса
prompt=consent&access_type=offline
в перенаправление OAuth (см. Страницу Google OAuth 2.0 для приложений веб-сервера ).Это побудит пользователя снова авторизовать приложение и всегда вернет
refresh_token
.источник
access_type=offline
во всех случаях, когда вы хотитеrefresh_token
.$client->setAccessType('offline')
. По умолчаниюfunction setApprovalPrompt()
уже переданоforce
.Чтобы получить токен обновления, вы должны добавить оба,
approval_prompt=force
иaccess_type="offline"
если вы используете java-клиент, предоставленный Google, он будет выглядеть следующим образом:источник
Я искал долгую ночь, и это делает свое дело:
Модифицированный user-example.php из admin-sdk
затем вы получите код по URL-адресу перенаправления и аутентификацию с кодом и получите токен обновления
Вы должны хранить его сейчас;)
Когда ваш accesskey истекает, просто сделайте
источник
Это вызвало у меня некоторую путаницу, поэтому я решил поделиться тем, чему научился на своем нелегком пути:
При запросе доступа с использованием
access_type=offline
иapproval_prompt=force
параметров , которые вы должны получить одновременно доступ маркеров и обновление маркеров. Доступа лексема истекает вскоре после вы получите его , и вам нужно будет обновить его.Вы правильно сделали запрос на получение нового токена доступа и получили ответ с новым токеном доступа . Меня также смутил тот факт, что я не получил новый токен обновления . Однако так и должно быть, поскольку вы можете использовать один и тот же токен обновления снова и снова.
Я думаю, что некоторые из других ответов предполагают, что вы по какой-то причине захотели получить себе новый токен обновления, и предположили, что вы повторно авторизуете пользователя, но на самом деле вам это не нужно, так как имеющийся у вас токен обновления будет работать до отозвано пользователем.
источник
Ответ Рича Саттона, наконец, сработал для меня, после того, как я понял, что добавление
access_type=offline
выполняется по запросу клиентского интерфейса для кода авторизации, а не по внутреннему запросу, который обменивает этот код на access_token. Я добавил комментарий к его ответу и эту ссылку в Google для получения дополнительной информации об обновлении токенов.PS Если вы используете Satellizer, вот как добавить эту опцию в $ authProvider.google в AngularJS .
источник
Для того, чтобы получить,
refresh_token
вам нужно включитьaccess_type=offline
в URL-адрес запроса OAuth. Когда пользователь впервые авторизуется, вы получите не ноль,refresh_token
аaccess_token
срок действия, срок действия которого истекает.Если вы столкнулись с ситуацией, когда пользователь может повторно аутентифицировать учетную запись, для которой у вас уже есть токен аутентификации (как упомянуто выше в @SsjCosty), вам необходимо получить информацию от Google, для которой этот токен предназначен. Для этого добавьте
profile
в свои рамки. При использовании OAuth2 Ruby gem ваш окончательный запрос может выглядеть примерно так:Обратите внимание, что в области есть две записи, разделенные пробелами, одна для доступа только для чтения к Google Analytics, а другая просто
profile
, что является стандартом OpenID Connect.Это приведет к тому, что Google предоставит дополнительный атрибут, называемый
id_token
вget_token
ответе. Чтобы получить информацию из id_token, просмотрите эту страницу в Документах Google. Существует несколько библиотек, предоставленных Google, которые будут проверять и «декодировать» это для вас (я использовал гем Ruby google-id-token ). После того, как вы его проанализируете, этотsub
параметр фактически станет уникальным идентификатором учетной записи Google.Стоит отметить, что если вы измените область действия, вы снова получите токен обновления для пользователей, которые уже прошли проверку подлинности в исходной области действия. Это полезно, если, скажем, у вас уже есть группа пользователей, и вы не хотите, чтобы они все отключили приложение в Google.
Да, и последнее замечание: вам не нужно
prompt=select_account
, но это полезно, если у вас есть ситуация, когда ваши пользователи могут захотеть пройти аутентификацию с использованием нескольких учетных записей Google (т. Е. Вы не используете это для входа / аутентификации) ,источник
1. Как получить «refresh_token»?
Решение: опция access_type = 'offline' должна использоваться при создании authURL. Источник: Использование OAuth 2.0 для приложений веб-сервера
2. Но даже с «access_type = offline» я не получаю «refresh_token»?
Решение: обратите внимание, что вы получите его только при первом запросе, поэтому, если вы храните его где-то и есть возможность перезаписать это в своем коде при получении нового access_token после истечения предыдущего срока действия, убедитесь, что это значение не перезаписано.
Из Google Auth Doc: (это значение = access_type)
Если вам снова понадобится «refresh_token», то вам нужно удалить доступ к своему приложению, выполнив шаги, описанные в ответе Рича Саттона .
источник
Установка этого параметра приведет к тому, что токен обновления будет отправляться каждый раз:
пример приведен ниже (php):
источник
Для меня я пробовал
CalendarSampleServlet
предоставленные Google. Через 1 час access_key истекает, и происходит перенаправление на страницу 401. Я перепробовал все вышеперечисленные варианты, но они не сработали. Наконец, после проверки исходного кода для «AbstractAuthorizationCodeServlet» , я увидел, что перенаправление будет отключено при наличии учетных данных, но в идеале его следует проверитьrefresh token!=null
. Я добавил ниже код,CalendarSampleServlet
и он работал после этого. Большое облегчение после стольких часов разочарования. Слава Богу.источник
Теперь Google отклонил эти параметры в моем запросе (access_type, prompt) ... :(, и вообще нет кнопки «Отменить доступ». Я расстраиваюсь из-за того, что вернул свой refresh_token lol
ОБНОВЛЕНИЕ: я нашел ответ здесь: D вы можете получить токен обновления по запросу https://developers.google.com/identity/protocols/OAuth2WebServer
источник
источник
Использование автономного доступа и подсказки: согласие хорошо для меня:
источник
Мое решение было немного странным. Я перепробовал каждое решение, которое нашел в интернете, и ничего Удивительно, но это сработало: удалите credentials.json, обновите, снова установите приложение в своей учетной записи. Новый файл credentials.json будет иметь токен обновления. Сделайте резервную копию этого файла где-нибудь. Затем продолжайте использовать приложение, пока ошибка обновления токена не появится снова. Удалите файл crendetials.json, который теперь только с сообщением об ошибке (в моем случае это произошло), затем вставьте старый файл учетных данных в папку, готово! Прошла 1 неделя с тех пор, как я это сделал, и проблем больше не было.
источник
Чтобы каждый раз при аутентификации получать новый refresh_token, тип учетных данных OAuth 2.0, созданных на панели мониторинга, должен быть «Другой». Также, как упомянуто выше, опция access_type = 'offline' должна использоваться при генерации authURL.
При использовании учетных данных с типом «веб-приложение» никакая комбинация переменных prompt / authentication_prompt работать не будет - вы все равно получите refresh_token только при первом запросе.
источник