谷歌OAuth 2授权-错误:redirect_uri_mismatch

617

我在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

这条信息是什么意思,我该如何修复它? 我使用了gem omniauth-google-oauth2


35
如遇此问题,您可通过在浏览器中访问以下URL进行调试:https://accounts.google.com/o/oauth2/auth?client_id={client_id}&response_type=token&redirect_uri={redirect_uri}&scope={scope},而无需运行整个应用程序进行测试。请注意,翻译时尽量保持原意,使内容更通俗易懂,不要添加解释或其他内容。 - Jack M
2
我注意到,谷歌自动将 redirect_uri 绑定在双引号中(redirect_uri="whatever")以上的 URL 中,并导致此错误。如果我删除这个双引号,我就能通过下一个屏幕了。现在,我们该如何避免这个双引号,因为它是由谷歌自动重定向的? - Abhishek Soni
@JackM,response_type 不应该等于 code 吗?那么 token 是什么? - Benyamin Jafari
47个回答

4

如果我们使用本地主机,它也将适用于已发布的网站。我的意思是,如果在API控制台中添加本地主机请求URI,那么当网站上线时它会如何工作?或者对于实际网站,我们需要在API控制台中放置另一组实际URI吗? - Unbreakable

4

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'

记住:不要包含尾部“/”


4
我的问题是地址栏中有http://localhost:3000/,而控制台中有http://127.0.0.1:3000/,这是关于编程的内容。

enter image description here

enter image description here


3

如果你不知道在新控制台中设置重定向URL的位置,可以参考以下步骤:API和身份验证 -> 凭据 -> OAuth 2.0客户端ID -> 点击链接查找所有重定向URL。


3
我有一个前端应用和后端 API。
我在后端服务器上测试时,调用 Google API 时遇到了这个错误。在整个过程中,我一直在想为什么我需要提供 redirect_uri,因为这只是后端,对于前端来说才有意义。
我所做的是从服务器上提供不同的 redirect_uri(虽然有效),但我的前端 URL 创建的 token code 不同。因此,当我将此代码传递给我的服务器端测试(其中 redirect-uri 是不同的)时,我遇到了这个错误。
所以不要犯这个错误。确保你的前端redirect_uri与你的服务器相同,因为 Google 使用它来验证真实性。

我有一个React前端和一个Flask后端,这个答案解决了我的问题。谢谢。 - Joe Gasewicz

3

重要补充:我发现在跨客户端服务器认证流程中,当您从Web SDK接收到serverAuthCode并设置redirect_uri为空时,应使用"postmessage"。而当您从AndroidiOS SDK接收到serverAuthCode时,也应将redirect_uri设置为


兄弟,我在这个问题上卡了15个小时,你真是给我带来了福音!谢谢!!对于其他人来说,在我的Python后端中,当验证令牌代码时,我传递了redirect_uri = "",然后它就起作用了。我还按照https://developers.google.com/identity/sign-in/ios/offline-access的指示进行操作,现在一切都正常了(虽然我正在使用已弃用的库,但目前它还能正常工作,并且似乎与正常的库做的事情一样)。 - undefined

3

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


如何更新它? - Rohan Devaki
@RohanDevaki 下载并替换JSON文件。 - Alexandru Burca

2
这个问题的主要原因只会来自Chrome浏览器,因为Chrome处理WWW和非WWW的方式取决于您在浏览器中输入URL的方式,它从Google搜索并直接显示结果,因此在不同情况下发送的重定向URL是不同的。

enter image description here

将所有可能的组合添加到从 Fiddler 发送的确切 URL 中,400 错误弹出窗口将不会提供您的确切 HTTP 和 WWW 信息。

2
让我补充一下 @Bazyl 的回答:在我收到的消息中,他们提到了 URI "http://localhost:8080/"(这显然是一个内部谷歌配置)。我将授权的 URI 更改为该 URI "http://localhost:8080/",然后消息就不再出现了……视频也上传成功了。API 文档非常糟糕……每次我使用谷歌 API 时,我只觉得“幸运”,但是缺乏良好的文档说明……:( 是的,我让它工作了,但我仍然不明白它为什么失败以及为什么它能够工作……在网页上只有一个地方可以确认 URI,并且它被复制到 client_secrets.json 中……我不知道是否存在第三个地方需要写相同的 URI……我认为谷歌 API 的设计不仅文档,而且 GUI 也很糟糕……

3
你发布的两个URI看起来完全相同,你是什么意思? - mLstudent33

2

我需要在API和服务 ->凭据 ->创建凭据 ->OAuth ->其他下创建一个新的客户端ID。

然后,我下载并使用了client_secret.json与我的命令行程序一起上传到我的YouTube账户。我曾试图使用Web应用程序OAuth客户端ID,但在浏览器中出现了重定向URI错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接