谷歌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个回答

1
如果您正在使用Passport.js并在Heroku上部署您的应用程序,您需要在Passport策略中添加此设置proxy: true。
passport.use(new GoogleStrategy(
    {
        clientID: keys.googleClientID,
        clientSecret: keys.googleClientSecret,
        callbackURL: '/auth/google/callback',
        proxy: true
    })

或者检查您的授权网址

必须是 https://yourwebsite/auth/google/callback


1
你需要做的是回到开发者控制台,进入 APIs & Auth > Consent Screen 并填写相关内容。具体来说,是填写产品名称。

此外,不要使用在其他项目中也使用的产品名称。确保它是唯一的。 - florisla

1

在控制台中,我有两个请求URI,分别是http://xxxxx/client/api/spreadsheet/authredirecthttp://localhost

我尝试了所有与此问题相关的顶级响应,并确认它们都不是我的问题。

我从控制台中删除了localhost,在我的项目中更新了client_secret.json,然后不匹配的错误就消失了。


1
以下是“redirect_uri_mismatch”错误发生的原因:
  1. 您的 Google 项目中的重定向 URL 字段为空。
  2. 重定向 URL 与您的网站不匹配。
  3. 重要提示!它仅适用于像 example.com、book.com 等有效域名(无法使用本地主机或 AWS LB URL)。

建议使用域名 URL。


1
应该怎么办,如果谷歌一直生成错误的redirect_uri参数?它会生成一个带有随机端口号的localhost:XXXXX,忽略我设置的创建客户端的重定向URI。 - A. Makarevich

1
我在本地机器上使用端口3000的Reactjs应用程序授权时遇到了同样的问题。我已将lvh.me添加到授权域中,并将http://lvh.me:3000添加为授权来源和授权重定向URL,如下图所示。
注意:您可以添加多个站点以进行验证域。例如,对于您的本地机器、暂存或其他环境。

enter image description here

enter image description here


1
我在使用Meteor和Ngrok时遇到了问题,尝试使用Google登录。 我将Ngrok URL放在Google开发者控制台中作为重定向URL,并转到了Ngrok URL页面。 问题在于,在执行应用程序时我没有使用Meteor的ROOT_URL,因此任何重定向都会转到localhost:3000而不是Ngrok URL。 只需通过将Ngrok URL添加为Meteor配置中的ROOT_URL或在终端上执行应用程序之前导出它来修复它,例如:export ROOT_URL=https://my_ngrok_url

1

请尝试进行以下检查:

  1. 在控制台和应用程序中设置Bundle ID。我更喜欢将应用程序的Bundle ID设置为"org.peredovik.${PRODUCT_NAME:rfc1034identifier}"
  2. 检查是否在“Info”选项卡中添加了URL类型,只需在标识符和URL方案中输入您的Bundle ID,角色设置为Editor
  3. 在cloud.google.com的控制台中,“API与授权” -> “同意屏幕”,填写有关您的应用程序的表单。“产品名称”是必填字段。

享受吧:)


1
在我的情况下,我需要检查web应用程序/安装应用程序的客户端ID类型。
安装应用程序: http://localhost [重定向URI] 在这种情况下,本地主机就可以工作。
Web应用程序: 您需要有效的域名[重定向URI:]。

1
我遇到了Google登录的同样问题。
我已在Google开发者控制台的Google凭据面板中正确输入了我的回调URL,以下是我的重定向URL:
https://www.example.com/signin-google

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

https://www.example.com/oauth2callback

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

一切看起来都很好,对吧?但直到我添加了一个更神奇的URL,它才开始工作。我添加了一个没有wwwsignin-google URL(这是默认的Google回调),问题解决了。

请注意(根据您的域名),您可能需要添加带有和不带有www的URL。


1
关键在于在创建ID时输入正确的重定向URL。我发现通过“编辑”更新ID后重定向URL并不能完成任务。对我有用的另一个方法是复制整个“vendor”文件夹并将其复制到“oauth”文件所在的相同位置(只需在成功生成令牌后删除重复的“vendor”文件夹)。这是因为尝试通过“../vendor/autoload”指向供应商文件夹对我无效。
因此,删除您现有的有问题的客户端OAuth ID,并尝试使用此方法,它将起作用。

那对我没有用,Google仍然要求我提供一个位于网站根目录之外的URI: redirect_uri: https://XXXXX.edu/AuthCallback/IndexAsync 应该是这个 https://XXXXX.edu/FOLDER/AuthCallback/IndexAsync - Jamie

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