494

在网站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

4

43 回答 43

488

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

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

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

于 2012-07-14T16:57:15.940 回答
157

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

其他常见的 URI 不匹配是:

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

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

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

  2. 选择您的项目

选择您的项目

  1. 点击菜单图标

点击菜单图标

  1. 点击API Manager菜单

选择 API 管理器菜单

  1. 点击Credentials菜单。在 下OAuth 2.0 Client IDs,您会找到您的客户名称。就我而言,它是Web Client 1. 单击它,将出现一个弹出窗口,您可以在其中编辑Authorized Javascript OriginAuthorized redirect URIs

选择凭证菜单

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

这是关于创建项目和客户 ID的 Google 文章。

于 2015-12-25T11:19:43.937 回答
111

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

于 2013-09-24T19:22:28.100 回答
85

在您在客户端检索授权代码的任何流程中,例如GoogleAuth.grantOfflineAccess()API,现在您想要将代码传递给您的服务器,兑换它,并存储访问和刷新令牌,那么您必须使用文字字符串postmessage而不是redirect_uri。

例如,在Ruby 文档中的代码片段上构建:

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+ 登录文档。这是 G+ 关闭后的屏幕截图和存档链接,此链接可能会消失:

旧版 Google+ API 文档

Offline Access 的文档页面没有提及这一点是绝对不可原谅的。#面部手掌

于 2018-01-05T20:51:44.877 回答
55

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

instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/
于 2014-10-19T06:59:21.660 回答
37

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

于 2014-02-12T13:48:40.950 回答
12

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

于 2015-06-03T15:16:11.783 回答
10

这个答案与这个 Mike's answerJeff's answer相同,都设置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 从前端接收代码,用谷歌的服务验证它(为你完成)。验证后,它将 JWT(令牌)发送回前端。前端现在可以获取令牌并将其存储在某处。
    • Django 中的所有 和都是REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI不必要的REST_SOCIAL_DOMAIN_FROM_ORIGINREST_SOCIAL_OAUTH_REDIRECT_URIsettings.py。(它们是 Django REST Social Auth 使用的常量)简而言之,您不必在 Django 中设置与重定向 url 相关的任何内容。在"redirect_uri": "postmessage"React 前端就足够了。这是有道理的,因为你必须在你身边做的社交身份验证工作都是前端的 Ajax 风格的 POST 请求,不提交任何表单,所以默认情况下实际上不会发生重定向。这就是为什么如果您使用代码 + JWT 流程,重定向 url 将变得无用,并且服务器端重定向 url 设置没有任何效果。
  4. Django REST Social Auth 处理帐户创建。这意味着它将检查 google 帐户电子邮件/姓氏,并查看它是否与数据库中的任何帐户匹配。如果没有,它会为您创建一个,使用确切的电子邮件和名字。但是,youremailprefix717e248c5b924d60如果您的电子邮件是youremailprefix@example.com. 它附加一些随机字符串以创建唯一的用户名。这是默认行为,我相信您可以自定义它并随意深入研究他们的文档。
  5. 前端存储该令牌,并且当它必须对后端服务器执行 CRUD 时,尤其是创建/删除/更新,如果您在Authorization标头中附加令牌并向后端发送请求,Django 后端现在会将其识别为登录,即经过身份验证用户。当然,如果您的令牌过期,您必须通过发出另一个请求来刷新它。

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

于 2019-03-06T03:46:44.970 回答
8

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

于 2013-08-21T13:57:15.683 回答
8

清单:

  • http还是https
  • &还是&amp;
  • 尾部斜杠(/)或打开
  • (CMD/CTRL)+F, 在凭证页面中搜索完全匹配。如果找不到,则搜索丢失的那个。
  • 等到谷歌刷新它。如果您经常更换,则可能每半小时发生一次,或者它可能会留在游泳池中。就我而言,几乎是半小时生效。
于 2016-02-16T09:07:52.443 回答
8

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

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

于 2016-03-12T05:31:04.497 回答
6

2015July15 - 上周在登录时使用此脚本的登录

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

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

在细节部分:redirect_uri=storagerelay://...

我通过更改为:

<script src="https://apis.google.com/js/client:platform.js?onload=startApp"></script>
于 2015-07-15T16:38:02.640 回答
6

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

在 GO 中,这解决了问题:

confg = &oauth2.Config{
        RedirectURL:  "postmessage",
        ClientID:   ...,
        ClientSecret: ...,
        Scopes:      ...,
        Endpoint:     google.Endpoint,
}
于 2017-06-04T18:03:15.643 回答
6

/请注意网址末尾 的额外http://localhost:8000内容与http://localhost:8000/

于 2017-07-12T07:22:14.730 回答
5

重定向 URL 区分大小写。

在我的情况下,我添加了两个: http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync

于 2016-09-28T09:42:16.343 回答
5

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

于 2018-11-13T20:29:29.403 回答
5

它已经得到了彻底的回答,但最近(比如一个月前)谷歌停止接受我的 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,这样您就知道要重定向到哪里

于 2021-03-30T21:59:13.953 回答
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 '

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

于 2016-02-23T03:48:03.923 回答
4

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

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

希望这可以帮助某人。

于 2016-11-04T14:54:38.883 回答
4

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

在此处输入图像描述

在此处输入图像描述

于 2020-07-17T16:25:22.963 回答
4

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

于 2020-10-12T19:10:13.923 回答
4

1.你会看到这样的错误

在此处输入图像描述

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

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

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

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

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

在此处输入图像描述

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

  2. 现在进入Authorized Javascript OriginsAuthorized redirect URLS 添加显示错误的 urlredirect_uri_mismatch即这里它是 http://algorithammer.herokuapp.com,所以我在两个地方都添加了 Authorized Javascript OriginsAuthorized redirect URLS

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

于 2022-02-04T06:54:47.793 回答
3

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

于 2015-10-21T11:37:58.950 回答
3

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

于 2021-02-16T17:29:46.587 回答
2

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

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

于 2017-12-29T00:41:32.670 回答
2

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

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

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

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

于 2018-11-18T11:57:33.867 回答
2

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

在此处输入图像描述

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

于 2019-08-31T11:06:10.997 回答
1

尝试进行以下检查:

  1. 控制台和应用程序中的捆绑 ID。我更喜欢像这样“org.peredovik.${PRODUCT_NAME:rfc1034identifier}”这样设置应用程序的Bundle ID
  2. 检查您是否在选项卡 Info 中添加了 URL 类型,只需在 Identifier 和 URL Schemes 中输入您的 Bundle ID,角色设置为 Editor
  3. 在 cloud.google.com 的控制台“APIs & auth”->“同意屏幕”中填写有关您的应用程序的表格。“产品名称”是必填字段。

享受 :)

于 2014-01-02T16:49:50.913 回答
1

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

于 2014-08-22T14:39:09.027 回答
1

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

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

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

于 2015-04-04T13:04:14.673 回答
1

您需要做的是返回您的开发者控制台并转到 APIs & Auth > Consent Screen 并填写。具体来说,产品名称。

于 2015-06-10T08:15:01.590 回答
1

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

我尝试了对这个问题的所有热门回答,并确认它们都不是我的问题。

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

于 2017-04-12T12:59:43.010 回答
1

我在谷歌登录时遇到了同样的问题。

我在谷歌开发者控制台的谷歌凭据面板中正确输入了我的回调,这是我的重定向网址:

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

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

https://www.example.com/oauth2callback

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

一切似乎都很好,对吧?但它仍然没有工作,直到我添加了一个更神奇的 Url我添加了没有www的登录谷歌URL(这是默认的谷歌回调)并解决了问题。

考虑到它(取决于您的域),您可能需要也可能不需要添加有和没有 www URL

于 2017-10-17T08:07:23.063 回答
1

以下是 Error: redirect_uri_mismatch 问题的原因:

  1. 您的谷歌项目中的重定向 URL 字段为空白。
  2. 重定向网址与您的网站不匹配
  3. 重要的!它仅适用于 example.com、book.com 等工作域(不适用于本地主机或 AWS LB URL)

推荐使用域名 URL

于 2018-12-07T12:44:00.683 回答
1

诀窍是在创建 ID 时输入正确的重定向 url。我发现通过“编辑”创建 ID 后更新重定向 URL 并不能完成工作。对我也有用的是复制整个“供应商”文件夹并将其复制到“oauth”文件所在的同一位置(直到您成功生成令牌,然后您可以删除重复的“供应商”文件夹)。这是因为试图通过 '../vendor/autoload' 指向供应商文件夹对我不起作用。

因此,删除您现有的麻烦的客户端 OAuth ID 并尝试这种方法,它会工作。

于 2018-12-24T00:19:45.823 回答
1

要使其在 localhost 上工作,如果用于 Web 服务器,请提供

Authorized JavaScript origins (Client ID for web appication)
e.g. http://localhost:4200
于 2019-01-18T08:48:14.500 回答
1

在尝试使用 Google 登录时,我在使用 Meteor 和 Ngrok 时遇到了这个问题。我将 Ngrok URL 作为重定向 URL 放在 Google Developer Console 中,然后转到 Ngrok URL 页面。问题是我在执行应用程序时没有使用 Meteor ROOT_URL,所以任何重定向都会转到localhost:3000Ngrok URL 的 insted。只需在 Meteor 的配置中添加 Ngrok URLROOT_URL或通过在终端上执行应用程序之前将其导出来修复它,例如:export ROOT_URL=https://my_ngrok_url

于 2019-05-31T17:32:56.173 回答
1

我在本地机器上使用端口 3000 在 Reactjs 应用程序中授权时遇到了同样的问题。
我已经添加lvh.me了授权域以及http://lvh.me:3000授权来源和授权重定向 URL,如下图所示。

注意:您可以为已验证的域添加多个站点。即用于您的本地机器、登台或其他环境

在此处输入图像描述

在此处输入图像描述

于 2019-07-12T07:59:10.210 回答
1

就我而言,我添加了

https://websitename.com/sociallogin/social/callback/?hauth.done=Google

Authorized redirect URIs部分中,它对我有用

于 2021-02-14T23:26:04.100 回答
1

重要补充:我发现在跨客户端服务器身份验证流程serverAuthCode中,当您从 Web SDK收到您的信息时,您应该使用“postmessage”,redirect_uri 当您serverAuthCodeAndroidiOS SDK 收到您的信息时,您应该使用“postmessage”。

于 2021-08-15T11:48:33.970 回答
1

如果您使用的是护照 js,并且您在 heroku 中部署您的应用程序,您需要添加此设置代理:护照策略中的 true

passport.use(new GoogleStrategy(
    {
        clientID: keys.googleClientID,
        clientSecret: keys.googleClientSecret,
        callbackURL: '/auth/google/callback',
        proxy: true
    })

或查看您的授权网址

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

于 2022-02-26T06:53:58.720 回答
0

不要忘记在您的域和 ip 之后包含路径。就我而言,我忘记了:

/oauth2callback

于 2016-11-19T01:05:23.973 回答
-2

已更新 --> 适用于 Android 应用

只需使用:

http://localhost/oauth2callback

如果您在没有 Web 应用程序的重定向链接的情况下处理自己的逻辑

于 2016-12-14T14:20:29.610 回答