ChatGPT解决这个技术问题 Extra ChatGPT

Google OAuth 2 授权 - 错误:redirect_uri_mismatch

在网站 https://code.google.com/apis/console 上,我注册了我的应用程序,将生成的 Client ID:Client Secret 设置到我的应用程序并尝试使用 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

此消息是什么意思,我该如何解决?我使用 gem omniauth-google-oauth2。

对于遇到此问题的其他人,请注意,您可以通过在浏览器中访问类似 https://accounts.google.com/o/oauth2/auth?client_id={client_id}&response_type=token&redirect_uri={redirect_uri}&scope={scope} 的 URL 来调试此问题,而不是运行整个应用程序进行测试。
我注意到,google 会自动在 url 上方的 (redirect_uri="whatever") 中用双引号绑定 redirect_uri,并导致此错误。如果我删除这个双引号,我可以通过下一个屏幕。现在,我们怎样才能避开这个双引号,因为它是由谷歌自己自动重定向的。

S
ShadowUC

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

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

编辑:(来自下面高度评价的评论)请注意,更新 google api 控制台和当前的更改可能需要一些时间。一般只有几分钟,但有时似乎更长。


有某种魔力,因为当我在一小时前尝试相同的回调时,它不起作用,但现在它起作用了。总之感谢!
遇到了类似的问题,并想指出更新 google api 控制台和存在的更改可能需要一些时间。一般只有几分钟,但有时似乎更长。
让我完成@Bazyl 的回答:在我收到的消息中,他们提到了 URI“localhost:8080”(当然,这似乎是谷歌的内部配置)。我更改了那个 "localhost:8080" 的授权 URI,但消息不再出现......视频上传了...... APIS 文档非常糟糕......每次我有一些东西可以使用google apis,我只是觉得“幸运”,但是缺乏关于它的好的文档.... :(
在浏览器中打开一个私人/隐身窗口,然后重试。有时这可以解决缓存问题。
google 在“Api & Auth > Credentials”中的 google 控制台中没有重定向 uri 的选项,不管我是创建新的客户端 ID 还是生成新的密钥,根本没有办法从谷歌控制台。
a
abdusco

在我的例子中,它是 wwwnon-www URL。实际网站有 www 个 URL,Google Developer Console 中的授权重定向 URInon-www 个 URL。因此,重定向 URI 不匹配。我通过将 Google Developer Console 中的 Authorized Redirect URIs 更新为 www URL 解决了这个问题。

其他常见的 URI 不匹配是:

在授权重定向 URI 中使用 http:// 并使用 https:// 作为实际 URL,反之亦然

在授权重定向 URI 中使用斜杠 (http://example.com/),而不使用斜杠 (http://example.com) 作为实际 URL,反之亦然

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

转到 https://console.developers.google.com 选择您的项目

https://i.stack.imgur.com/RJfZi.png

点击菜单图标

https://i.stack.imgur.com/xPR5j.png

单击 API 管理器菜单

https://i.stack.imgur.com/VQ9la.png

单击凭据菜单。在 OAuth 2.0 客户端 ID 下,您将找到您的客户端名称。在我的例子中,它是 Web 客户端 1。单击它,将出现一个弹出窗口,您可以在其中编辑 Authorized Javascript Origin 和 Authorized redirect URIs。

https://i.stack.imgur.com/X6rRh.png

注意:Authorized URI 默认包含所有 localhost 链接,任何 live 版本都需要包含完整路径,而不仅仅是域,例如 https://example.com/path/to/oauth/url

这是一篇关于 creating project and client ID 的 Google 文章。


我将 Authorized JavaScript origins 保留为空,并将 Authorized redirect URIs 保留为 127.0.0.1/google_account/authentication,它对我有效。
对于那些为此苦苦挣扎的人,如果您通过其他一些谷歌页面(例如 Drive API 页面)创建您的应用程序,您可能看不到这些选项。我不得不从 API Manager 控制台中删除并重新创建客户端 ID。
为了查看 JavaScript 来源和重定向 URI,我需要将应用程序类型设置为“Web 应用程序”:
我没有找到这个选项。也许用户界面改变了?
J
Jason Watkins

如果您使用 Google+ javascript 按钮,则必须使用 postmessage 而不是实际的 URI。由于谷歌的文档出于某种原因没有明确说明,我几乎花了一整天的时间才弄清楚这一点。


由于这个问题是谷歌搜索错误消息时最热门的问题,这里有一些额外的提示。正如 Mike 所说,为您的重定向 URI 使用“postmessage”。您需要在 2 个地方指定它(如果您使用的是 web-app-server-flow)。一个是在 javascript 上的 g-signin 按钮中。另一个在您的服务器代码中的签名授权客户端中。
postmessage 听起来不错,但它会导致无用的 Error: invalid_request origin parameter is required!
花了几个小时试图解决这个问题后,你的回答对我帮助很大!谷歌文档不是很清楚。在服务器端,如果您使用 Google API 客户端库,您应该使用以下代码:$client->setRedirectUri('postmessage'); 而不是 $client->setRedirectUri('http://your.url...');
哇.... @Guicara 解决方案在我的头撞墙数小时后对我有用。
我正在努力使用 django-rest-social-auth 和 angular 前端来解决这个问题。当我将“postmessage”作为redirect_uri 传递时,它的工作原理。非常感谢 !!!
J
Jeff Ward

在您在客户端检索到授权代码的任何流程中,例如 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"}

唯一提到 postmessage 的 Google 文档就是这个 old Google+ sign-in doc。这是一个屏幕截图和 archive link,因为 G+ 正在关闭并且此链接可能会消失:

https://i.stack.imgur.com/rFKLj.png

doc page for Offline Access 没有提及这一点是绝对不可原谅的。 #FacePalm


@mariobgr 是的,这里的其他答案提到了postmessage,但我想给出这个疯狂的无证黑客何时对我来说是必要的具体情况(例如grantOfflineAccess)。 :PI 也不希望它是真的。 :) 让我头疼了好几个小时。
今天早上让我烧了几个小时的另一件事postmessage:通过谷歌自己的Python客户端代码解析后,我终于遇到了这个:“postmessage:字符串,这通常设置为'postmessage'以匹配客户端的redirect_uri指定”此外,在他们的文档中:“默认的 redirect_uri 是当前 URL 去除了查询参数和哈希片段。”这意味着如果您的 redirect_uri 不是当前 url,那么您需要在 gapi.auth2.init() 中明确指定它,并且在服务器端,您将使用 postmessage
杰夫,你真棒!我只是花了几个小时尝试调试 Google 的 Auth API,这是问题之一。没有在任何地方记录的疯狂“解决方案”。事实上,他们自己的文档在这里给出了错误的答案。极好的! (另外,实际的 %2F Google 是什么?)
G
Guven Sezgin Kurt

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

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

感谢分享,有帮助。我被困在这个问题上,因为 GitHub OAuth2 API 不需要您删除端口号。
这也对我有用。我正在学习这门课程:asp.net/mvc/overview/security/… 并收到“重定向 uri 错误”。在我将 localhost:44334/signin-google 更改为 localhost/signin-google 后,它起作用了。非常感谢有用的提示。
太感谢了。我正在使用此 github.com/google/google-api-dotnet-client-samples 进行测试,每次运行它时,“请求中的重定向 URI”似乎来自不同的端口。这对我帮助很大。弄清楚发生了什么需要几个小时!
太棒了,这非常适合我的情况!我必须添加 127.0.0.1/authorize ,因为它没有解析到 localhost DNS
C
Chintan

确保检查协议“http://”或“https://”,因为谷歌也检查协议。最好在列表中添加两个 URL。


不,最好确保您使用的是 https。
R
Rohan Devaki

1.你会看到这样的错误

https://i.stack.imgur.com/8YFfB.png

https://i.stack.imgur.com/PazSa.png

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

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

https://i.stack.imgur.com/gpDSI.png

单击菜单 -> API 和服务 -> 凭证

https://i.stack.imgur.com/KsQOF.png

您会看到这样的仪表板,现在在 Authorized Javascript Origins 和 Authorized redirect URLS 中单击编辑 OAuth Client 添加显示错误的 URL,称为 redirect_uri_mismatch 即这里是 http://algorithammer.herokuapp.com,所以我添加了在 Authorized Javascript Origins 和 Authorized redirect URLS 的两个地方都单击保存并等待 5 分钟,然后尝试再次登录


a
arshpreet

这似乎很奇怪和烦人,没有“一个”解决方案。对我来说,http://localhost:8000 没有成功,但 http://localhost:8000/ 成功了。


这是因为 redirect_uri 在开发人员控制台和您的应用程序中必须是 EXACT MATCH。
我在开发人员控制台和应用程序中都没有结尾“/”。两者都是完全匹配的,但它不起作用。我必须添加一个结尾“/”才能使脚本正常工作。
这解决了我的问题,谢谢。不知道为什么需要这样做。
S
Shaung Cheng

此答案与 this Mike's answerJeff's answer 相同,都在客户端将 redirect_uri 设置为 postmessage。我想添加更多关于服务器端的信息,以及适用于此配置的特殊情况。

技术栈

后端

蟒蛇 3.6

姜戈 1.11

Django REST Framework 3.9:服务器作为 API,不渲染模板,在其他地方没有做太多。

Django REST 框架 JWT 1.11

Django REST 社交认证 < 2.1

前端

React:16.8.3,create-react-app 版本 2.1.5

反应谷歌登录:5.0.2

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

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

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

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


c
codezjx

https://i.stack.imgur.com/K9Fz7.png

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


K
Kathir

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


由于谷歌不同意 [landed1.github.io/videos.html#/oauth2callback]is 有效的 URL,因此基于 Angular 的深层链接存在问题。
i
itsazzad

清单:

http 还是 https?

& 或 &?

尾部斜杠(/)或打开?

(CMD/CTRL)+F,在凭证页面中搜索完全匹配。如果找不到,则搜索丢失的那个。

等到谷歌刷新它。如果您经常更换,则可能每半小时发生一次,或者它可能会留在游泳池中。就我而言,几乎是半小时生效。


J
Janek Olszak

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

在 GO 中,这解决了问题:

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

w
wolfgang

注意网址 http://localhost:8000 末尾的额外 /http://localhost:8000/ 不同


J
Jacek Góraj

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


谢谢!我找不到问题所在
l
luismzk

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

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

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

callbackURL: "/register/google/redirect"

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

callbackURL: "https://" + process.env.MY_URL+ "/register/google/redirect"

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

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


谢谢你,兄弟!这就是问题所在。
A
Andrii Abramov

2015 年 7 月 15 日 - 上周在登录时使用此脚本的登录

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

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

并在详细信息部分:redirect_uri=storagerelay://...

我通过更改为:

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

遇到相同的错误 400,但更改脚本在我的 Cordova WebView 中不起作用。
@NickSpacek 请检查缺少的双引号是否负责。
h
h3n

重定向 URL 区分大小写。

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


请注意 URL 末尾的字符“/”。有时需要,有时不需要。
所以即使对于实时网站,我们也可以将 localhost 保留为 request_uri?
b
brntsllvn

Rails 用户(来自 omniauth-google-oauth2 文档):

修复 Rails 中 redirect_uri 的协议不匹配 只需根据 Rails.env 在 OmniAuth 中设置 full_host。 # config/initializers/omniauth.rb OmniAuth.config.full_host = Rails.env.production? ? 'https://domain.com' : 'http://localhost:3000'

记住:不要包含尾随的“/”


D
Dheeraj Palagiri

以上解决方案都不适合我。下面做了

将授权的重定向 URL 更改为 - https://localhost:44377/signin-google

希望这可以帮助某人。


如果我们使用 localhost 它也适用于已发布的网站。我的意思是,如果在 API 控制台中添加 localhost 请求 URI。网站上线后它将如何工作?或者对于实时站点,我们需要在 API 控制台中放置另一组实际 URI?
A
Aindriú

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

https://i.stack.imgur.com/da1dy.png

https://i.stack.imgur.com/0z4ry.png


C
Code4Art

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


S
Steji

任何人都在努力寻找在新控制台中设置重定向 URL 的位置:APIs & Auth -> Credentials -> OAuth 2.0 client IDs -> 单击链接以查找所有重定向 URL


A
Alexandru Burca

我的两分钱:如果使用 Google_Client 库,请不要忘记在更新重定向 URI 后更新服务器上的 JSON 文件。


如何更新?
@RohanDevaki 下载并替换 JSON 文件。
J
James T.

我需要在 APIs & Services -> Credentials -> Create credentials -> OAuth -> Other 下创建一个新的客户端 ID

然后我下载了 client_secret.json 并将其与正在上传到我的 youtube 帐户的命令行程序一起使用。我试图使用 Web App OAuth 客户端 ID,它在浏览器中给了我重定向 URI 错误。


B
Blue

我有前端应用程序和后端 API。

在我的后端服务器上,我通过点击 google api 进行测试并面临这个错误。在我的整个时间里,我一直在想为什么我需要提供 redirect_uri 因为这只是后端,对于前端来说它是有道理的。

我正在做的是从服务器提供不同的 redirect_uri (虽然有效)(假设这只是占位符,它只需要注册到谷歌)但我创建令牌代码的前端 url 是不同的。因此,当我在服务器端测试中传递此代码时(redirect-uri 不同),我遇到了这个错误。

所以不要犯这个错误。确保您的前端 redirect_uri 与您的服务器相同,因为 google 使用它来验证真实性。


我有一个 React 前端和一个 Flask 后端,这个答案解决了我的问题。谢谢
S
Subrata Fouzdar

此问题的主要原因将仅来自 chrome 和 chrome 处理 WWW 和非 www 的方式不同,具体取决于您在浏览器中输入 URL 的方式,它从 google 搜索并直接显示结果,因此发送的重定向 URL 在不同的案子

https://i.stack.imgur.com/btOP7.png

添加所有可能的组合,您可以找到从 fiddler 发送的确切 url,弹出的 400 错误不会为您提供确切的 http 和 www 信息


V
Vlad

尝试进行以下检查:

控制台和应用程序中的捆绑 ID。我更喜欢像这样“org.peredovik.${PRODUCT_NAME:rfc1034identifier}”设置应用程序的捆绑 ID 检查您是否在选项卡信息中添加了 URL 类型,只需在标识符和 URL 方案中输入您的捆绑 ID,角色设置为云控制台中的编辑器。 google.com "APIs & auth" -> "Consent screen" 填写关于您的应用程序的表格。 “产品名称”是必填字段。

享受 :)


D
David L

让我完成@Bazyl 的回答:在我收到的消息中,他们提到了 URI "http://localhost:8080/"(当然,这似乎是谷歌的内部配置)。我更改了那个 "http://localhost:8080/" 的授权 URI,并且消息不再出现...视频已上传... APIS 文档非常蹩脚...每次我有一些使用 google apis 的东西,我只是觉得“幸运”,但缺乏关于它的良好文档.... :( 是的,我让它工作了,但我还不明白它为什么失败,也不明白为什么它工作......那里只是在网络上确认 URI 的一个地方,它被复制到 client_secrets.json 中......我不明白是否有第三个地方应该写相同的 URI......我发现也不只有文档而且Google的api的GUI设计也很蹩脚...


您发布的两个 URI 看起来都相同。你是什么意思?
B
Bhuwan Gautam

就我而言,我必须检查 Web 应用程序/已安装应用程序的客户端 ID 类型。

已安装的应用程序:http://localhost [重定向 URI] 在这种情况下 localhost 可以正常工作

Web 应用程序:您需要有效的域名 [重定向 URI:]


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅