Я все время получаю сообщение invalid_grant
об ошибке при попытке получить токен oAuth от Google для подключения к их контактам api. Вся информация верна, и я трижды проверил это, так что в тупике.
Кто-нибудь знает, что может вызвать эту проблему? Я попытался настроить для него другой идентификатор клиента, но получил тот же результат, я пробовал подключить много разных способов, включая принудительную аутентификацию, но все равно результат тот же.
google-api
Андре Фигейра
источник
источник
Ответы:
Я столкнулся с этой проблемой, когда я явно не запрашивал «автономный» доступ при отправке пользователя на OAuth: «Вы хотите дать этому приложению разрешение прикасаться к вашим материалам?» стр.
Убедитесь, что вы указали access_type = offline в своем запросе.
Подробности здесь: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Также: я думаю, что Google добавил это ограничение в конце 2011 года. Если у вас есть старые токены, полученные ранее, вам нужно будет отправить своих пользователей на страницу разрешений, чтобы разрешить автономное использование.)
источник
access_type
вoffline
, эта ошибка все еще происходит.Я столкнулся с этой же проблемой, несмотря на то, что
access_type
в моем запросе указывал "офлайн" в соответствии с ответом bonkydog. Короче говоря, я обнаружил, что описанное здесь решение сработало для меня:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
По сути, когда вы добавляете клиент OAuth2 в консоль Google API, Google предоставит вам «идентификатор клиента» и «адрес электронной почты» (при условии, что вы выбрали «webapp» в качестве типа клиента). И, несмотря на вводящие в заблуждение соглашения об именах Google, они ожидают, что вы отправите «адрес электронной почты» в качестве значения
client_id
параметра при доступе к их API OAuth2.Это применимо при вызове обоих этих URL:
Обратите внимание, что вызов первого URL-адреса будет успешным, если вы вызовете его со своим «Идентификатором клиента» вместо своего «адреса электронной почты». Однако использование кода, возвращенного из этого запроса, не будет работать при попытке получить токен носителя со второго URL-адреса. Вместо этого вы получите сообщение «Ошибка 400» и «invalid_grant».
источник
Хотя это старый вопрос, похоже, что многие до сих пор с ним сталкиваются - мы потратили дни напролет, отслеживая его сами.
В спецификации OAuth2 «invalid_grant» является своего рода универсальным средством для всех ошибок, связанных с недействительными / просроченными / отозванными токенами (разрешение авторизации или токен обновления).
Для нас проблема была двоякой:
Пользователь активно отозвал доступ к нашему приложению.
Имеет смысл, но поймите следующее: через 12 часов после отзыва Google перестает отправлять сообщение об ошибке в своем ответе:
“error_description” : “Token has been revoked.”
это вводит в заблуждение, потому что вы предполагаете, что сообщение об ошибке присутствует постоянно, а это не дело. Вы можете проверить, есть ли у вашего приложения доступ, на странице разрешений приложений .
Пользователь сбросил / восстановил свой пароль Google.
В декабре 2015 года Google изменил свое поведение по умолчанию, так что при сбросе пароля для пользователей, не использующих Google Apps, автоматически отменяются все токены обновления приложений пользователя. При отзыве сообщение об ошибке подчиняется тому же правилу, что и предыдущий случай, поэтому вы получите "error_description" только в первые 12 часов. Кажется, нет никакого способа узнать, отозвал ли пользователь вручную доступ (намеренно) или это произошло из-за сброса пароля (побочный эффект).
Помимо этого, существует множество других потенциальных причин, которые могут вызвать ошибку:
Я написал небольшую статью, в которой резюмирует каждый элемент с некоторыми рекомендациями по отладке, чтобы помочь найти виновника. Надеюсь, поможет.
источник
Я столкнулся с той же проблемой. Для меня я исправил это, используя адрес электронной почты (строка, которая заканчивается на ... @ developer.gserviceaccount.com) вместо идентификатора клиента для значения параметра client_id. Названия, установленные Google, сбивают с толку.
источник
Моя проблема заключалась в том, что я использовал этот URL:
Когда мне следовало использовать этот URL:
Это было тестирование учетной записи службы, которая хотела автономный доступ к ядру хранилища .
источник
У меня было такое же сообщение об ошибке «invalid_grant», потому что authResult ['code'], отправленный с клиентской стороны javascript, не был правильно получен на сервере.
Попробуйте вывести его обратно с сервера, чтобы убедиться, что он правильный, а не пустая строка.
источник
если вы используете библиотеку писцов, просто настройте автономный режим, например, bonkydog предлагает вот код:
https://github.com/codolutions/scribe-java/
источник
Используя Android clientId (без client_secret), я получил следующий ответ об ошибке:
Я не могу найти никакой документации для поля «code_verifier», но обнаружил, что если вы установите для него равные значения как в запросах авторизации, так и в запросах токенов, это устранит эту ошибку. Я не уверен, каким должно быть предполагаемое значение и должно ли оно быть безопасным. Он имеет некоторую минимальную длину (16? Символов), но я обнаружил, что настройка
null
также работает.Я использую AppAuth для запроса авторизации в своем Android-клиенте, который имеет
setCodeVerifier()
функцию.Вот пример запроса токена в узле:
Я тестировал, и это работает с обоими
https://www.googleapis.com/oauth2/v4/token
иhttps://accounts.google.com/o/oauth2/token
.Если вы используете
GoogleAuthorizationCodeTokenRequest
вместо этого:источник
Это глупый ответ, но проблема для меня заключалась в том, что я не понял, что мне уже был выдан активный токен oAuth для моего пользователя Google, который мне не удалось сохранить. Решение в этом случае - перейти в консоль api и сбросить секрет клиента.
На этот счет есть множество других ответов на SO, например, Reset Client Secret OAuth2 - Нужно ли клиентам повторно предоставлять доступ?
источник
Возможно, вам придется удалить устаревший / недействительный ответ OAuth.
Кредит: образец node.js google oauth2 перестал работать invalid_grant
Примечание . Ответ OAuth также станет недействительным, если пароль, использованный при первоначальной авторизации, был изменен.
В среде bash для удаления устаревшего ответа можно использовать следующее:
rm /Users/<username>/.credentials/<authorization.json>
источник
Есть две основные причины ошибки invalid_grant, о которых вы должны позаботиться до запроса POST для токена обновления и токена доступа.
RFC 6749 OAuth 2.0 определил invalid_grant как: предоставленное разрешение авторизации (например, код авторизации, учетные данные владельца ресурса) или токен обновления недействителен, истек, отозван, не соответствует URI перенаправления, используемому в запросе авторизации, или был выдан другому клиенту ,
Я нашел еще одну хорошую статью, здесь вы найдете много других причин этой ошибки.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
источник
Если вы тестируете это в почтальоне / бессоннице и просто пытаетесь заставить его работать, подсказка: код аутентификации сервера (параметр кода) годен только один раз. Это означает, что если вы добавите какие-либо другие параметры в запрос и вернете 400, вам нужно будет использовать новый код аутентификации сервера, иначе вы просто получите еще 400.
источник
на этом сайте console.developers.google.com
эта консольная плата выберите ваш проект, введите адрес клятвы. URL-адрес обратного вызова oauth будет перенаправлен при успехе oauth
источник
Рассмотрев и опробовав все остальные способы, вот как я решил проблему в nodejs с помощью
googleapis
модуля в сочетании сrequest
модулем, который я использовал для получения токенов вместо предоставленногоgetToken()
метода:Я просто использую
request
для выполнения запроса api через HTTP, как описано здесь: https://developers.google.com/identity/protocols/OAuth2WebServer#offlineисточник
Попробуйте изменить свой URL для запроса на
источник
Для будущих людей ... Я читал много статей и блогов, но мне повезло с решением ниже ...
это блоге описаны различные случаи возникновения ошибки «invalid_grant».
Наслаждаться!!!
источник
для меня я должен был убедиться, что
redirect_uri
это точное совпадение с тем в консоли разработчикаAuthorised redirect URIs
, который исправил его для меня, я смог отладить и узнать, в чем именно была проблема после переключения сhttps://accounts.google.com/o/oauth2/token
наhttps://www.googleapis.com/oauth2/v4/token
У меня правильная ошибка:
источник
У меня возникла эта проблема после включения нового API службы в консоли Google и попытки использовать ранее созданные учетные данные.
Чтобы решить эту проблему, мне пришлось вернуться на страницу учетных данных, щелкнув имя учетных данных и снова нажав «Сохранить» . После этого я мог нормально пройти аутентификацию.
источник
В моем случае проблема была в моем коде. По ошибке я пытался запустить клиента 2 раза с одними и теми же токенами. Если ни один из приведенных выше ответов не помог, убедитесь, что вы не создаете 2 экземпляра клиента.
Мой код до исправления:
как только я изменю его на (используйте только один экземпляр):
это устранило мои проблемы с типом гранта.
источник
Для меня проблема заключалась в том, что у меня было несколько клиентов в моем проекте, и я почти уверен, что это нормально, но я удалил всех клиентов для этого проекта и создал новый, и все начало работать на меня (эта идея появилась из справки по плагину WP_SMTP форум поддержки) Я не могу найти эту ссылку для справки
источник
Если вы дезинфицируете пользовательский ввод (например,
$_GET["code"]
в php), убедитесь, что вы случайно не заменили что-то в коде.Регулярное выражение, которое я использую, сейчас
/[^A-Za-z0-9\/-]/
источник
Посмотрите на это https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988
Сначала вам нужен access_token:
Сохраните токен доступа, токен обновления и expire_in в базе данных. Срок действия токена доступа истекает через $ expires_in секунд. Затем вам нужно получить новый токен доступа (и сохранить его в базе данных) со следующим запросом:
Не забывайте добавить домен redirect_uri к своим доменам в консоли Google: https://console.cloud.google.com/apis/credentials на вкладке «OAuth 2.0-Client-IDs». Там вы также найдете свой Client-ID и Client-Secret.
источник
Существует недокументированный тайм-аут между тем, когда вы впервые перенаправляете пользователя на страницу аутентификации Google (и получаете обратно код), и когда вы берете возвращенный код и отправляете его по URL-адресу токена. Он отлично работает для меня с фактическим предоставленным Google client_id, а не с «недокументированным адресом электронной почты». Мне просто нужно было начать процесс заново.
источник