谷歌OAuth 2 authorization - Error: redirect_uri_mismatch

在网站https://code.google.com/apis/console上,我已经注册了我的应用程序,设置生成的客户机ID:客户的秘密到我的应用程序,并尝试用谷歌登录。 不幸的是,我得到了错误消息:

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

这条消息是什么意思,我该如何修复它? 我使用宝石omniauth-google-oauth2.

881036 次浏览

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

转到项目的控制台,在API Access下查看。你应该看到你的client ID &client secret,以及重定向uri的列表。如果您想要的URI没有列出,单击编辑设置并将URI添加到列表中。

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

当你在https://code.google.com/apis/console注册你的应用程序和 创建一个客户端ID,你就有机会指定一个或多个重定向 uri。您的认证URI上的redirect_uri参数的值必须

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

试着做这些检查:

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

享受:)

>确保检查协议“http://”或“https://”,因为谷歌也检查协议。 最好将两个URL都添加到列表中
让我来完成@Bazyl的回答:在我收到的消息中,他们提到了URI # EYZ0 (当然,这似乎是一个内部谷歌配置)。我修改了它的授权URI, "http://localhost:8080/",消息没有出现了…视频上传了…api文档很蹩脚…每次我有一些工作与谷歌api,我只是觉得“幸运”,但有一个好的文档缺乏关于它....:(是的,我让它工作了,但我既不明白为什么它失败了,也不明白为什么它工作了……在web中只有一个地方可以确认URI,它被复制在client_secrets.json中…我不知道是否有第三个地方应该写相同的URI…我发现不仅文档,而且谷歌的api的GUI设计相当蹩脚…< / p >

对于我的web应用程序,我纠正了我的错误

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

在我的情况下,我必须检查客户端ID类型的web应用程序/已安装的应用程序。

安装的应用程序:http://localhost[重定向uri] 在这种情况下,localhost工作

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

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

你需要做的是回到你的开发人员控制台,然后进入api &认证>同意屏幕并填写。具体来说,就是产品名称。

2015年7月15日-上周在登录时使用这个脚本工作的登录

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

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

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

我把它改成:

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

任何人都在努力寻找在新的控制台设置重定向url: api &认证->凭据-> OAuth 2.0客户端id ->单击链接找到所有重定向url

在我的例子中,它是wwwnon-www URL。实际站点有www URL和谷歌开发控制台中的授权重定向uri URL。因此,重定向URI存在不匹配。我通过将谷歌开发人员控制台中的Authorized Redirect URIs更新为www URL来解决它。

其他常见的URI不匹配有:

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

下面是谷歌开发人员控制台的逐步截图,这样对于那些很难找到开发人员控制台页面来更新重定向uri的人是有帮助的。

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

  2. 选择项目

Select your Project .

  1. 点击菜单图标

点击菜单图标

  1. 点击API Manager菜单

Select API Manager menu .

  1. 点击Credentials菜单。在OAuth 2.0 Client IDs下面,您将找到您的客户名称。在我的例子中,它是Web Client 1。点击它,会出现一个弹出窗口,你可以编辑授权Javascript来源授权重定向uri

Select Credentials menu .

请注意:默认情况下,授权URI包括所有本地主机链接,任何活跃版本都需要包括完整路径,而不仅仅是域,例如https://example.com/path/to/oauth/url

这里有一篇谷歌关于创建项目和客户端ID的文章。

检查表:

  • http还是https?
  • &还是&amp;?
  • (/)或打开 ?
  • (CMD/CTRL)+F,在凭据页面中搜索完全匹配的。如果
  • 等待谷歌刷新。可能每半小时发生一次,如果你 经常更换,否则可能会留在池中。对我来说,几乎用了半个小时才生效

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

修复redirect_uri在Rails中的协议不匹配

只需要根据Rails.env在OmniAuth中设置full_host。

#配置/初始化/ omniauth.rb

OmniAuth.config。full_host = Rails.env.production?? '# eyz0 ': '# eyz1 '

记住:不要包括后面的"/"

在我的例子中,我的证书应用类型是“其他”。所以我在凭证页面上找不到Authorized redirect URIs。它似乎出现在应用程序类型:“Web应用程序”。但是您可以单击Download JSON按钮来获得client_secret.json文件。 # EYZ0 < / p >

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

重定向url区分大小写。

在我的例子中,我添加了两个: http://localhost:5023/AuthCallback/IndexAsync # EYZ0 < / p >

以上的方法对我来说都没用。下面是

将url重定向到- https://localhost:44377/signin-google

希望这能帮助到一些人。

不要忘记在域名和ip后面加上路径。就我而言,我忘记了:

/ oauth2callback

更新—>适用于Android应用程序

只使用:

http://localhost/oauth2callback

如果你处理自己的逻辑没有重定向链接的web应用程序

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

我尝试了这个问题的所有回答,并确认没有一个是我的问题。

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

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

在GO中,这解决了问题:

confg = &oauth2.Config{
RedirectURL:  "postmessage",
ClientID:   ...,
ClientSecret: ...,
Scopes:      ...,
Endpoint:     google.Endpoint,
}
小心url末尾额外的/ http://localhost:8000不同于http://localhost:8000/

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

我已经在谷歌开发人员控制台的谷歌凭据面板中正确输入了我的回调 这是我的重定向url:

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


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


https://www.example.com/oauth2callback


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

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

考虑到这一点(取决于你的域名),你可能需要或不需要同时添加www url

我需要在api下创建一个新的客户端ID;服务—>证书—>创建证书—> OAuth—>其他

然后下载并使用client_secret。Json和我的命令行程序上传到我的YouTube帐户。我试图使用Web应用程序OAuth客户端ID,这给了我浏览器中的重定向URI错误。

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

谷歌文档中唯一提到postmessage的是老谷歌+登录文件。这里是截图和归档链接,因为G+即将关闭,这个链接可能会消失:

Legacy谷歌+ API DOC

doc页面离线访问没有提到这一点是绝对不可原谅的。# EYZ1

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

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

从我的后端服务器,我通过点击谷歌api进行测试,并面临这个错误。在我的整个时间里,我想知道为什么我需要给redirect_uri,因为这只是后端,对于前端它是有意义的。

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

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

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

  1. 重定向URL字段空白在您的谷歌项目。
  2. 重定向URL与您的网站不匹配
  3. 重要!它将只与工作域,如example.com, book.com等(不与本地主机或AWS LB URL工作)

建议使用域URL

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

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

要使它在本地主机上工作,如果使用web服务器,请提供

Authorized JavaScript origins (Client ID for web appication)
e.g. http://localhost:4200

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

技术堆栈

后端

  • Python 3.6
  • Django 1.11
  • Django REST Framework 3.9:服务器作为API,没有渲染模板,没有在其他地方做太多。
  • # EYZ0 1.11
  • # EYZ0 & lt;2.1

前端

  • 反应: 16.8.3, create-react-app版本2.1.5
  • # EYZ0: 5.0.2

“代码”流程(专门用于谷歌OAuth2)

总结:React—>请求社交认证“代码”—>请求jwt令牌,以获得您自己的后端服务器/数据库的“登录”状态。

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

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

我在使用Meteor和Ngrok时遇到了这个问题,同时试图登录谷歌。 我把Ngrok URL放在谷歌开发人员控制台作为重定向URL,然后转到Ngrok URL页面。问题是我在执行应用程序时没有使用Meteor的ROOT_URL,所以任何重定向都会转到localhost:3000而不是Ngrok URL。 只是通过在Meteor的配置中添加Ngrok URL作为ROOT_URL来修复它,或者在终端上执行应用之前将其导出,如:export ROOT_URL=https://my_ngrok_url

我在我的本地机器上的端口3000的Reactjs应用程序中有同样的问题 我在授权域中添加了lvh.me,在授权源和授权重定向URL中分别添加了http://lvh.me:3000,如下图所示。< / p >

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

enter image description here

enter image description here

这个问题的主要原因只会来自chrome和chrome处理WWW和非WWW不同取决于你如何在浏览器中输入你的URL,它从谷歌搜索并直接显示结果,所以发送的重定向URL在不同的情况下是不同的

enter image description here

添加所有可能的组合,你可以找到确切的url从fiddler, 400错误弹出不会给你确切的http和www信息

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

enter image description here

enter image description here

只要确保你输入的是URL,而不是一个域名。 所以不要: domain.com 应该是这样 domain.com/somePathWhereYouHadleYourRedirect < / >强

就我而言,我补充道

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

Authorized redirect URIs部分,它为我工作

My two cents:
如果使用Google_Client库,不要忘记在更新重定向URI之后更新服务器上的JSON文件

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

无论如何,问题是常规400:redirect_uri_mismatch,但唯一的区别是,它是从https://更改为http://,和谷歌将不允许您注册http://重定向URI,因为它们是生产发布状态(而不是localhost)。

问题是在我的回调(我使用护照认证),我只做了

callbackURL: "/register/google/redirect"

读文档,他们用的是完整的URL,所以我改成了

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

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

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

重要补充:我发现在跨客户端服务器认证流上你应该使用“postmessage”;当你从Web SDK收到serverAuthCode时,设置redirect_uri 当你从安卓iOS SDK收到serverAuthCode时。

1.您将看到类似这样的错误

enter image description here

2.然后单击请求详细信息 # EYZ0 < / p >

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

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

enter image description here # EYZ0 < / p >

  1. 点击菜单>API和;服务→凭证

enter image description here

  1. 你会看到一个像这样的仪表板,点击编辑OAuth客户端 # EYZ0 < / p >

  2. 现在在Authorized Javascript OriginsAuthorized redirect URLS 添加url,显示错误名为redirect_uri_mismatch,即这里 http://algorithammer.herokuapp.com,所以我已经添加了这两个地方 Authorized Javascript OriginsAuthorized redirect URLS

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

如果你正在使用passport js,你正在heroku中部署你的应用程序,你需要在passport策略中添加这个设置proxy: true

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

或检查您的授权url

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

在我的例子中,redirect-uri是http://127.0.0.1:5000/auth/google/callback
我一直通过http://localhost:5000/auth/google
请求 确保你使用的是localhost还是127.0.0.1.

我也得到这个错误error -400: redirect_uri_mismatch

这不是一个服务器客户端错误,但你只需要检查你没有像这样在结尾添加/(正斜杠)

重定向URL列表❌:

https://developers.google.com/oauthplayground/

这样做只✅:

https://developers.google.com/oauthplayground

在我的例子中,重置secret ('reset secret'-按钮)就成功了。