Авторизация Google OAuth 2-Ошибка: несоответствие uri перенаправления

на сайте https://code.google.com/apis/console я зарегистрировал свое приложение, настроил сгенерированный идентификатор клиента: и Ключ в мое приложение и попытался войти в систему с помощью Google. К сожалению, я получил сообщение об ошибке:

Error: redirect_uri_mismatch
The redirect URI in the request: http://127.0.0.1:3000/auth/google_oauth2/callback did not match a registered redirect URI

scope=https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
response_type=code
redirect_uri=http://127.0.0.1:3000/auth/google_oauth2/callback
access_type=offline
approval_prompt=force
client_id=generated_id

что значит это сообщение и как я могу это исправить? Я использую камень omniauth-Google-на что OAuth2.

26 ответов


URI перенаправления (куда возвращается ответ) должен быть зарегистрирован в консоли API, и ошибка указывает, что вы не сделали этого или не сделали это правильно.

перейдите к консоли для вашего проекта и посмотрите в разделе доступ к API. Вы должны увидеть свой идентификатор клиента и секрет там, вместе со списком URI перенаправления. Если нужного URI нет в списке, нажмите кнопку Изменить параметры и добавьте URI в список.


в моем случае это был www и non-www URL-адрес. Фактический сайт имел www URL и Авторизованный Перенаправление URIs в консоли разработчика Google было non-www URL-адрес. Следовательно, было несоответствие в перенаправлении URI. Я решил это, обновив Authorized Redirect URIs в консоли разработчика Google для www URL-адрес.

другие общие несоответствия URI:

  • используя http:// в авторизованном перенаправлении URIs и https:// как фактический URL, или наоборот
  • используя Слэш (http://example.com/) в авторизованном перенаправлении URIs и не используя конечную косую черту (http://example.com) как фактический URL, или наоборот

вот пошаговые скриншоты консоли разработчика Google, так что это было бы полезно для тех, кто получает его трудно найти страницу консоли разработчика для обновления перенаправления URIs.

  1. на https://console.developers.google.com

  2. выберите проект

Select your Project

  1. нажмите на значок меню

Click on the menu icon

  1. нажать на кнопку API Manager меню

Select API Manager menu

  1. нажать на кнопку . И под OAuth 2.0 Client IDs, вы найдете своего клиента имя. В моем случае это Web Client 1. Нажмите на него, и появится всплывающее окно, где вы можете редактировать Авторизованный Javascript Origin и авторизованный перенаправление URIs.

Select Credentials menu

вот статья Google на создание проекта и ID клиента.


Если вы используете кнопка Google + javascript, то вы должны использовать postmessage вместо фактического URI. Мне потребовался почти целый день, чтобы понять это, так как документы Google по какой-то причине не ясно заявляют об этом.


для моего веб-приложения я исправил свою ошибку, пишет

instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/

обязательно проверьте протокол " http://" или " https://", как google проверяет протокол. Лучше добавить оба URL в список.


в любом потоке, где вы извлекли код авторизации на стороне клиента, например GoogleAuth.grantOfflineAccess() API, и теперь вы хотите передать код на свой сервер, выкупить его и сохранить токены доступа и обновления, тогда вам нужно использовать литеральную строку postmessage вместо redirect_uri.

например, основываясь на фрагменте в Ruby doc:

client_secrets = Google::APIClient::ClientSecrets.load('client_secrets.json')
auth_client = client_secrets.to_authorization
auth_client.update!(
  :scope => 'profile https://www.googleapis.com/auth/drive.metadata.readonly',
  :redirect_uri => 'postmessage' # <---- HERE
)

# Inject user's auth_code here:
auth_client.code = "4/lRCuOXzLMIzqrG4XU9RmWw8k1n3jvUgsI790Hk1s3FI"
tokens = auth_client.fetch_access_token!
# { "access_token"=>..., "expires_in"=>3587, "id_token"=>..., "refresh_token"=>..., "token_type"=>"Bearer"}

единственная документация Google даже упоминание postmessage это старый Google + вход в doc. Это абсолютно непростительно, что страница doc для автономного доступа не упоминает об этом. #FacePalm


Это кажется довольно странным и раздражающим, что нет" одного " решения. для меня http://localhost:8000 не получилось, но http://localhost:8000/ сработало.


2015July15-подпись, которая работала на прошлой неделе с этим скриптом при входе

<script src="https://apis.google.com/js/platform.js" async defer></script>

перестала работать и начала вызывать ошибку 400 с Error: redirect_uri_mismatch

и в разделе подробности:redirect_uri=storagerelay://...

Я решил ее изменив:

<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>

при регистрации приложения вhttps://code.google.com/apis/console и сделайте идентификатор клиента, вы получите возможность указать одно или несколько перенаправлений идентификатор URI. Значение redirect_uri параметр на вашем URI auth должен точно совпадают с одним из них.


контрольные вопросы:

  • http или https?
  • & или &amp;?
  • косая черта(/) или ?
  • (CMD/CTRL)+F поиск точного соответствия в учетных страницы. Если не найден тогда поиск пропавшего.
  • подождите, пока google обновит его. Может произойти в каждые полчаса, если вы часто меняются или могут остаться в бассейне. Для моего случая это заняло почти полчаса.

url перенаправления чувствителен к регистру.

в моем случае я добавил оба: http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync


пользователи Rails (из omniauth-Google-на что OAuth2 docs):

исправление несоответствия протокола для redirect_uri в Rails

просто установите full_host в OmniAuth на основе рельсов.env.

# config / инициализаторы / omniauth.rb

OmniAuth.конфиг.full_host = рельсы.env.производство? ? 'https://domain.com' : 'http://localhost:3000'

помните: не включать трейлинг "/"


в моем случае мой тип приложения учетных данных - "другое". Поэтому я не могу найти Authorized redirect URIs на странице учетных данных. Кажется, появляется в типе приложения:"веб-приложение". Но вы можете нажать для получения . enter image description here

откройте файл json, и вы можете найти такой параметр:"redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]. Я выбираю использовать http://localhost и она отлично работает для меня.


Если вы используете этот учебник:https://developers.google.com/identity/sign-in/web/server-side-flow тогда вы должны использовать "postmessage".

в GO это исправило проблему:

confg = &oauth2.Config{
        RedirectURL:  "postmessage",
        ClientID:   ...,
        ClientSecret: ...,
        Scopes:      ...,
        Endpoint:     google.Endpoint,
}

позвольте мне завершить ответ @ Bazyl: в сообщении, которое я получил, они упомянули URI "http://localhost:8080/" (что, конечно, кажется внутренней конфигурацией google). Я изменил авторизованный URI для этого, "http://localhost:8080/" , и сообщение больше не появится... И видео загрузили... Документация API очень хромает... Каждый раз, когда у меня что-то работает с Google apis, я просто чувствую себя "счастливым", но нет хорошей документации об этом.... : (Да, у меня это работает, но я не и все же не понимаю, почему это не удалось и почему это сработало... Было только одно место для подтверждения URI в интернете, и он был скопирован в client_secrets.формат JSON... Я не понимаю, есть ли третье место, где нужно написать тот же URI... Я нахожу не только документацию, но и дизайн GUI api Google довольно хромым...


любой, кто пытается найти, где установить URL-адреса перенаправления в новой консоли: APIs & Auth - > учетные данные - > идентификаторы клиентов OAuth 2.0 - > нажмите ссылку, чтобы найти все ваши URL-адреса перенаправления


ни одно из вышеперечисленных решений не сработало для меня. ниже ли

изменить авторизованные URL-адреса перенаправления на - https://localhost:44377/signin-google

надеюсь, это кому-то поможет.


остерегайтесь дополнительных / в конце url-адреса http://localhost:8000 отличается от http://localhost:8000/


попробуйте сделать эти проверки:

  1. Bundle ID в консоли и в вашем приложении. Я предпочитаю установить идентификатор пакета приложения, как это " org."передовик".${PRODUCT_NAME:rfc1034identifier}"
  2. проверьте, если вы добавили типы URL на вкладке Info просто введите идентификатор пакета в схемах идентификаторов и URL, роль установлена в Editor
  3. в консоли на cloud.google.com "APIs & auth" - > "экран согласия" заполните форму о вашей заявке. "Название продукта" обязательно поле.

наслаждайтесь :)


в моем случае мне пришлось проверить тип идентификатора клиента для веб-приложений / установленных приложений.

установленные приложения: http://localhost [Перенаправление URIs] В этом случае localhost просто работает

веб-приложения: вам нужно действительное доменное имя [перенаправление URIs:]


Что вам нужно сделать, это вернуться к консоли разработчика и перейти к APIs & Auth > экран согласия и заполнить это. В частности, название продукта.


Не забудьте включить путь после вашего домена и ip. В моем случае, я забыл:

/oauth2callback


У меня было два запроса URIs в консоли,http://xxxxx/client/api/spreadsheet/authredirect и http://localhost.

Я попробовал все лучшие ответы на этот вопрос и подтвердил, что ни одна из них не была моей проблемой.

Я удалил localhost из консоли, обновил client_secret.JSON в моем проекте, и ошибка ушла.


У меня была та же проблема с входом в google, я собирался вытащить волосы!!! Я правильно ввел свои обратные вызовы на панели учетных данных google в консоли разработчика google вот мои URL-адреса перенаправления :

https://www.example.com/signin-google

https://www.example.com/signin-google/

https://www.example.com/oauth2callback

https://www.example.com/oauth2callback/

кажется, все в порядке? но это все равно не сработало, пока я не добавил еще один магический Url добавил signin-google url (который по умолчанию google обратного вызова) без www и проблема решена.

примите это во внимание (в зависимости от вашего домена), вам может потребоваться или не нужно добавлять как с URL-адресами www, так и без них


Мне нужно было создать новый идентификатор клиента в API & Services - > учетные данные - > создать учетные данные - > OAuth - > Other

затем я загрузил и использовал client_secret.json с моей программой командной строки, которая загружается в мою учетную запись youtube. Я пытался использовать идентификатор клиента OAuth веб-приложения, который давал мне ошибку URI перенаправления в браузере.


обновлено -- > работа для приложений Android

просто использовать:

http://localhost/oauth2callback

Если вы обрабатываете свою собственную логику без ссылки перенаправления для веб-приложений