Google OAuth 2授权 - 错误:redirect_uri_mismatch

use*_*621 362 authentication oauth-2.0 google-signin

在网站https://code.google.com/apis/console上我已经注册了我的应用程序,为我的应用设置了生成的客户端ID:客户端密钥,并尝试使用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
Run Code Online (Sandbox Code Playgroud)

这条消息是什么意思,我该如何解决?我使用gem omn​​iauth-google-oauth2.

Ste*_*zyl 363

重定向URI(返回响应的位置)必须在API控制台中注册,错误表明您没有这样做,或者没有正确完成.

转到项目的控制台,查看API Access.您应该看到您的client ID&client secret那里,以及重定向URI列表.如果未列出所需的URI,请单击编辑设置并将URI添加到列表中.

编辑:(从下面评价很高的评论)请注意,更新谷歌api控制台和存在的更改可能需要一些时间.一般只有几分钟但有时似乎更长.

  • 遇到类似的问题,并想要注意更新谷歌api控制台和存在的变化可能需要一些时间.一般只有几分钟但有时似乎更长. (327认同)
  • 让我完成@ Bazyl的回答:在我收到的消息中,他们提到了URI"http:// localhost:8080 /"(当然,这似乎是一个内部谷歌配置).我更改了那个的授权URI,"http:// localhost:8080 /",消息不再出现了...视频上传了... APIS文档非常蹩脚......每次我有一些与谷歌apis合作的东西,我只是觉得"幸运",但是缺乏关于它的良好文档..... :( (26认同)
  • 谷歌没有选择在"Api&Auth>凭据"中的谷歌控制台中重定向uri,无论我是创建新的客户端ID还是生成新密钥,根本没有办法指定重定向uri来自谷歌控制台. (16认同)
  • 有一种魔力,因为当我在一小时前尝试相同的回调时,它没有用,但现在它正在工作.不管怎样,谢谢! (7认同)
  • 在浏览器中打开隐私/隐身窗口,然后重试.有时这会解决缓存问题. (7认同)
  • "编辑设置"按钮仅适用于Web应用程序.如果找不到该设置,则需要创建"Web应用程序的客户端ID". (3认同)
  • "一般只需几分钟,但有时似乎更长".什么是最长的人不得不等待?我现在已经等了大约一个小时但它仍然无效,我100%确定我已经正确设置了一切. (3认同)
  • 我能够获得重定向选项的唯一方法是通过 http://stackoverflow.com/a/17976227/3338098 这解决了我所有的问题 (2认同)
  • 我只是想说明这是insaaaaane!从字面上看,疯了!我花了很多年的时间来解决这个问题. (2认同)
  • 任何人都在努力寻找在新控制台中设置重定向网址的位置:API&Auth - >凭据 - > OAuth 2.0客户端ID - >单击链接以查找所有重定向网址 (2认同)
  • 我只是因为这些完全没有逻辑的错误而逐渐消失。我的意思是 http://www. 和 http://www. 之间有什么区别?myweb.com 和 http://www.myweb.com/ 。难道这些事情不应该由他们来处理吗:(真的很令人失望 (2认同)
  • 凭据的类型也很重要。“其他”不会为您提供添加“授权重定向 URI”的选项,而“Web 应用程序”可以。 (2认同)
  • 请注意,Google API 控制台对您输入的 URL 非常敏感。如上所述,它区分大小写。它也对尾部斜杠敏感。只需将其视为严格字符串相等的东西即可。 (2认同)

Muk*_*ain 102

就我而言,它是wwwnon-wwwURL.实际站点具有wwwURL,Google Developer Console中的授权重定向URI具有non-wwwURL.因此,重定向URI存在不匹配.我通过Authorized Redirect URIs在Google Developer Console中更新为wwwURL 解决了这个问题.

其他常见的URI不匹配是:

  • 使用http://在授权的重定向URI和https://作为实际的URL,或者反之亦然
  • 使用尾部的斜杠(http://example.com/在授权重定向的URI),而不是使用斜线(http://example.com)作为实际的URL,或反之亦然

以下是Google Developer Console的逐步截图,以便对那些难以找到开发人员控制台页面以更新重定向URI的人有所帮助.

  1. 转到https://console.developers.google.com

  2. 选择您的项目

选择您的项目

  1. 单击菜单图标

单击菜单图标

  1. 点击API Manager菜单

选择API Manager菜单

  1. 点击Credentials菜单.在下OAuth 2.0 Client IDs,你会找到你的客户名称.就我而言,它是Web Client 1.单击它,将出现一个弹出窗口,您可以在其中编辑授权的Javascript Origin授权的重定向URI.

选择

以下是有关创建项目和客户端ID的Google文章.

  • 这个答案确实需要推高,因为它提供了真正的答案.我们遇到了完全相同的问题,这有助于解决它 - 谢谢! (9认同)
  • 我的问题是我知道该怎么做,但不知道在UI中找到它的位置.这里的截图有帮助.谢谢. (4认同)
  • 我保留授权的JavaScript来源为空,授权重定向URI为http://127.0.0.1/google_account/authentication,它对我有用. (3认同)

Mik*_*nov 86

如果您使用的是Google+ javascript按钮,那么您必须使用postmessage而不是实际的URI.由于Google的文档由于某种原因没有明确说明,我花了差不多整整一天的时间来解决这个问题.

  • 由于这个问题在谷歌搜索错误消息时是最受欢迎的,这里有一些额外的指针.正如Mike所说,使用"postmessage"作为重定向URI.您需要在2个位置指定它(如果您使用的是web-app-server-flow).一个是在javascript上的g-signin按钮.另一个是服务器代码中的signet授权客户端. (8认同)
  • 在花了几个小时试图解决这个问题之后,你的答案对我帮助很大!Google文档不是很清楚.在服务器端,如果您使用Google API客户端库,则应使用以下代码:`$ client-> setRedirectUri('postmessage');`而不是`$ client-> setRedirectUri('http://your.url. ..');` (8认同)
  • postmessage听起来不错,但它导致无用的`Error:invalid_request`` origin参数是必需的!` (4认同)
  • 哇.... @Guicara解决方案在我的头撞墙后数小时为我工作. (3认同)

Roh*_*aki 56

1.你会看到这样的错误

在此输入图像描述

2.然后您应该点击请求详细信息 在此输入图像描述

之后,您必须复制该网址并将其添加到https://console.cloud.google.com/

  1. 转到https://console.cloud.google.com/

在此输入图像描述 在此输入图像描述

  1. 单击菜单 -> API 和服务 -> 凭据

在此输入图像描述

  1. 您将看到这样的仪表板,单击“编辑 OAuth 客户端” 在此输入图像描述

  2. 现在Authorized Javascript Origins添加Authorized redirect URLS 显示错误的网址,称为redirect_uri_mismatchie,这里是 http://algorithammer.herokuapp.com,所以我在 Authorized Javascript Origins和 的两个地方都添加了它Authorized redirect URLS

  3. 点击保存并等待5分钟,然后尝试再次登录


Guv*_*urt 40

对于我的网络应用程序,我通过写作纠正了我的错

instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢。我正在使用这个 https://github.com/google/google-api-dotnet-client-samples 进行测试,每次运行它时,“请求中的重定向 URI”似乎都来自不同的端口。这对我帮助很大。要弄清楚发生了什么需要几个小时! (2认同)

Jef*_*ard 40

在您在客户端检索授权代码的任何流程中,例如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"}
Run Code Online (Sandbox Code Playgroud)

唯一提到的Google文档postmessage就是这个旧的Google+登录文档.离线访问doc页面没有提到这一点是绝对不可原谅的.#FacePalm


Chi*_*tan 29

确保检查协议"http://"或"https://"作为谷歌检查协议.最好在列表中添加两个URL.

  • 我希望我提前两小时滚动到你的答案 (10认同)
  • 不,最好确保您使用的是 https。 (2认同)

Jac*_*raj 8

对我来说,这是因为在“授权重定向 URI”列表中,我错误地放置了https://developers.google.com/oauthplayground/代替https://developers.google.com/oauthplayground/末尾没有)。


Sha*_*eng 8

这个答案与迈克的答案杰夫的答案相同,都设置redirect_uripostmessage客户端。我想添加更多有关服务器端的信息,以及适用于此配置的特殊情况。

技术堆栈

后端

前端

“代码”流程(专门针对 Google OAuth2)

摘要:React --> 请求社交身份验证“代码” --> 请求 jwt 令牌以获取您自己的后端服务器/数据库的“登录”状态。

  1. 前端 (React) 使用“Google 登录按钮”来responseType="code"获取授权码。(这不是令牌,不是访问令牌!)
    • 谷歌登录按钮来自react-google-login上面提到的。
    • 单击该按钮将弹出一个窗口供用户选择帐户。用户选择一项并且窗口关闭后,您将从按钮的回调函数中获取代码。
  2. 前端将此发送到后端服务器的 JWT 端点。
    • POST 请求,带有{ "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
  3. 对于我的 Django 服务器,我使用 Django REST Framework JWT + Django REST Social Auth。Django 从前端接收代码,使用 Google 的服务验证它(已为您完成)。验证后,它将把 JWT(令牌)发送回前端。前端现在可以获取令牌并将其存储在某个地方。
    • 所有REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI,REST_SOCIAL_DOMAIN_FROM_ORIGINREST_SOCIAL_OAUTH_REDIRECT_URI在 Django 中settings.py都是不必要的。(它们是 Django REST Social Auth 使用的常量)简而言之,您不必在 Django 中设置与重定向 url 相关的任何内容。React前端"redirect_uri": "postmessage"就足够了。这是有道理的,因为您必须在前端执行的社交身份验证工作都是 Ajax 风格的 POST 请求,而不提交任何表单,因此实际上默认情况下不会发生重定向。这就是为什么如果您使用代码 + JWT 流程,则重定向 url 变得毫无用处,并且服务器端重定向 url 设置不会生效。
  4. Django REST Social Auth 处理帐户创建。这意味着它将检查谷歌帐户电子邮件/姓氏,并查看它是否与数据库中的任何帐户匹配。如果没有,它会使用确切的电子邮件和名字为您创建一个。youremailprefix717e248c5b924d60但是,如果您的电子邮件是 ,则用户名将类似于youremailprefix@example.com。它附加一些随机字符串来创建唯一的用户名。这是默认行为,我相信您可以自定义它并随意深入研究他们的文档。
  5. 前端存储该令牌,当它必须向后端服务器执行 CRUD 时,尤其是创建/删除/更新,如果您将令牌附加在Authorization标头中并向后端发送请求,Django 后端现在会将其识别为登录,即经过身份验证用户。当然,如果您的令牌过期,您必须通过发出另一个请求来刷新它。

天哪,我花了6个多小时终于搞定了!我相信这是我第一次看到这个postmessage东西。任何从事Django + DRF + JWT + Social Auth + React组合工作的人肯定会遇到这种情况。我不敢相信除了这里的答案之外,没有一篇文章提到过这一点。但如果您使用 Django + React 堆栈,我真的希望这篇文章可以为您节省大量时间。


小智 8

它已经得到了彻底的回答,但最近(比如一个月前)Google 停止接受我的 URI,它不起作用。我知道它之前确实这样做过,因为有一个用户注册了它。

无论如何,问题是常规的 400:redirect_uri_mismatch,但唯一的区别是它从 https:// 更改为 http://,并且 Google 不会允许您注册 http:// 重定向 URI,因为它们是生产发布状态(与本地主机相对)。

问题出在我的回调中(我使用 Passport 进行身份验证),我只做了

callbackURL: "/register/google/redirect"
Run Code Online (Sandbox Code Playgroud)

阅读文档,他们使用了完整的 URL,所以我将其更改为

callbackURL: "https://" + process.env.MY_URL+ "/register/google/redirect"
Run Code Online (Sandbox Code Playgroud)

将 https localhost 添加到我接受的 URI 中,以便我可以在本地进行测试,然后它再次开始工作。

TL;DR 使用完整的 URL,以便您知道要重定向到哪里


ars*_*eet 7

这似乎很奇怪而且很烦人,没有"一个"解决方案.对我来说http:// localhost:8000没有成功,但http:// localhost:8000 /已经解决了.

  • 这是因为`redirect_uri`必须是开发人员控制台和应用程序中的精确匹配. (2认同)

Kat*_*hir 6

当您在https://code.google.com/apis/console上注册应用并创建客户端ID时,您有机会指定一个或多个重定向URI.redirect_uri您的身份验证URI上的参数值必须与其中一个完全匹配.

  • 似乎网址"https:// code.google.com/apis/console"不再有效 (2认同)

小智 6

重定向 URL 区分大小写。

就我而言,我添加了两者: http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync


Eri*_*Aky 6

只需确保您输入的是 URL 而不仅仅是域名。因此,而不是: domain.com ,它应该是 domain.com/somePathWhereYouHadleYourRedirect


ton*_*gil 5

2015年7月15日 - 登录时使用此脚本上周正在运行的登录信息

<script src="https://apis.google.com/js/platform.js" async defer></script>
Run Code Online (Sandbox Code Playgroud)

停止工作并开始导致错误400 Error: redirect_uri_mismatch

在DETAILS部分: redirect_uri=storagerelay://...

我改为:

<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>
Run Code Online (Sandbox Code Playgroud)


its*_*zad 5

清单:

  • http还是https
  • &还是&amp;
  • 尾部斜杠(/)还是打开?
  • (CMD/CTRL)+F,在凭证页面中搜索完全匹配.如果没有找到,则搜索丢失的那个.
  • 等到谷歌刷新它.如果您经常更换或者可能会留在游泳池中,可能会在每半个小时内发生一次.对我而言,生效将近半个小时.


cod*_*zjx 5

就我而言,我的凭证申请类型是“其他”。所以我Authorized redirect URIs在凭据页面中找不到。它似乎出现在应用程序类型:“Web 应用程序”中。但是您可以单击Download JSON按钮来获取client_secret.json文件。 在此处输入图片说明

打开json文件,可以找到这样的参数:"redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]. 我选择使用http://localhost并且它对我来说很好用。


Jan*_*zak 5

如果您使用本教程:https : //developers.google.com/identity/sign-in/web/server-side-flow那么您应该使用“postmessage”。

在 GO 这解决了这个问题:

confg = &oauth2.Config{
        RedirectURL:  "postmessage",
        ClientID:   ...,
        ClientSecret: ...,
        Scopes:      ...,
        Endpoint:     google.Endpoint,
}
Run Code Online (Sandbox Code Playgroud)


wol*_*ang 5

当心/网址末尾 的额外内容http://localhost:8000http://localhost:8000/


Ain*_*riu 5

我的问题是地址栏中有 http://localhost:3000/ ,而console.developers.google.com 中有http://127.0.0.1:3000/

在此输入图像描述

在此输入图像描述


The*_* 24 5

我也收到此错误 Error-400:redirect_uri_mismatch

\n

这不是serverClient side错误,但您只需检查是否没有像这样在末尾添加/(正斜杠)即可进行更改

\n

重定向 URL 列表 \xe2\x9d\x8c:

\n
https://developers.google.com/oauthplayground/\n
Run Code Online (Sandbox Code Playgroud)\n

仅执行此操作 \xe2\x9c\x85:

\n
https://developers.google.com/oauthplayground\n
Run Code Online (Sandbox Code Playgroud)\n