Google OAuth 2授权 - 错误:redirect_uri_mismatch

时间:2012-07-14 16:08:02

标签: authentication oauth-2.0 google-signin

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

39 个答案:

答案 0 :(得分:341)

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

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

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

答案 1 :(得分:88)

就我而言,它是wwwnon-www网址。实际网站包含www网址,Google Developer Console中的授权重定向URI 包含non-www网址。因此,重定向URI存在不匹配。我通过将Google Developer Console中的Authorized Redirect URIs更新为www网址来解决此问题。

其他常见的URI不匹配是:

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

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

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

  2.   
  3. 选择您的项目

  4.   

Select your Project

  
      
  1. 点击菜单图标
  2.   

Click on the menu icon

  
      
  1. 点击API Manager菜单
  2.   

Select API Manager menu

  
      
  1. 点击Credentials菜单。在OAuth 2.0 Client IDs下,您将找到您的客户名称。就我而言,它是Web Client 1。点击它,会出现一个弹出窗口,您可以在其中编辑授权的Javascript Origin 授权的重定向URI
  2.   

Select Credentials menu

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

答案 2 :(得分:80)

如果您使用的是 Google+ javascript按钮,那么您必须使用postmessage而不是实际的URI。由于谷歌的文档由于某种原因没有明确说明,我花了差不多一整天的时间来解决这个问题。

答案 3 :(得分:37)

对于我的网络应用程序,我通过编写

纠正了我的错误
instead of : http://localhost:11472/authorize/
type :      http://localhost/authorize/

答案 4 :(得分:29)

请务必检查协议“http://”或“https://”作为Google检查协议。 最好在列表中添加两个URL。

答案 5 :(得分:27)

在您在客户端检索授权码的任何流程中,例如 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 +正在关闭,此链接可能会消失:

Legacy Google+ API DOC

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

答案 6 :(得分:7)

这似乎很奇怪而且很烦人,没有&#34;一个&#34;解决方案在那里。 对我来说http://localhost:8000没有成功,但http://localhost:8000/已经解决了。

答案 7 :(得分:6)

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

答案 8 :(得分:5)

清单:

  • httphttps
  • &&amp;
  • 尾部斜杠(/)或打开
  • (CMD/CTRL)+F,在凭据页面中搜索完全匹配。如果 找不到,然后搜索遗失的那个。
  • 等到谷歌刷新它。如果你,可能每半小时发生一次 经常变化或者可能留在游泳池中。对我而言,生效将近半个小时。

答案 9 :(得分:4)

重定向网址区分大小写。

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

答案 10 :(得分:3)

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

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

希望这有助于某人。

答案 11 :(得分:2)

就我而言,我的凭证申请类型是&#34;其他&#34;。因此,我无法在凭据页面中找到Authorized redirect URIs。它似乎出现在应用程序类型中:&#34; Web应用程序&#34;。但您可以单击Download JSON按钮获取client_secret.json文件。 enter image description here

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

答案 12 :(得分:2)

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

技术堆栈

后端

前端

“代码”流程(专用于Google OAuth2)

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

  1. 前端(反应)使用带有responseType="code"的“ Google登录按钮”来获取授权码。 (这不是令牌,不是访问令牌!)
    • google登录按钮来自上述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从前端接收代码,并通过Google的服务(为您完成)进行验证。验证后,它将把JWT(令牌)发送回前端。前端现在可以收获令牌并将其存储在某个地方。
    • Django REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI中所有REST_SOCIAL_DOMAIN_FROM_ORIGINREST_SOCIAL_OAUTH_REDIRECT_URIsettings.py都是不必要的。 (它们是Django REST Social Auth使用的常量)简而言之,您无需在Django中设置与重定向URL相关的任何内容。 React前端中的"redirect_uri": "postmessage"就足够了。这是有道理的,因为您要做的社交身份验证工作是前端中所有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堆栈。

答案 13 :(得分:2)

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

不同

答案 14 :(得分:2)

如果你使用本教程:https://developers.google.com/identity/sign-in/web/server-side-flow那么你应该使用&#34; postmessage&#34;。

在GO中解决了这个问题:

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

答案 15 :(得分:2)

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

答案 16 :(得分:2)

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

  

修复Rails中redirect_uri的协议不匹配

     

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

     

#config / initializers / omniauth.rb

     

OmniAuth.config.full_host = Rails.env.production? ? &#39; https://domain.com&#39; :&#39; http://localhost:3000&#39;

请记住:不要包含尾随&#34; /&#34;

答案 17 :(得分:1)

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

enter image description here

enter image description here

答案 18 :(得分:1)

任何人都在努力寻找在新控制台中设置重定向网址的位置:API&amp;验证 - &gt;凭证 - &gt; OAuth 2.0客户端ID - &gt;点击链接查找所有重定向网址

答案 19 :(得分:1)

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

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

答案 20 :(得分:1)

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

答案 21 :(得分:1)

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

答案 22 :(得分:1)

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

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

enter image description here

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

答案 25 :(得分:0)

就我而言,我添加了

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

Authorized redirect URIs 部分,它对我有用

答案 26 :(得分:0)

在具有端口3000的本地计算机上的Reactjs应用中,我遇到了相同的问题。
我已在授权域中添加了lvh.me,并在授权域中添加了http://lvh.me:3000,分别如下图所示。

注意:您可以为经过验证的域添加多个站点。即适用于您的本地计算机,暂存环境或其他环境

enter image description here

enter image description here

答案 27 :(得分:0)

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

答案 28 :(得分:0)

要使其在localhost上运行,并且如果用于网络服务器,请提供

tr.fullrow:hover{
    background-color:yellow;
    font-size:16px;
}

答案 29 :(得分:0)

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

因此,请删除您现有的麻烦的客户端OAuth ID,然后尝试这种方法,它将起作用。

答案 30 :(得分:0)

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

  1. 您的Google项目中的“重定向URL”字段为空。
  2. 重定向URL与您的网站不匹配
  3. 重要!它将仅适用于工作域,例如example.com,book.com等(不适用于本地主机或AWS LB URL)

建议使用域URL

答案 31 :(得分:0)

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

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

我正在做的是从服务器提供不同的redirect_uri(尽管有效)(假设这只是占位符,只需要向Google注册),但是创建令牌代码的前端URL是不同的。因此,当我在服务器端测试中通过此代码时(重定向uri有所不同),我遇到了此错误。

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

答案 32 :(得分:0)

我有同样的问题,谷歌登录,我正要拉我的头发! 我在谷歌开发者控制台的Google Credential面板中正确输入了我的回调 这是我的重定向网址:

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

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

https://www.example.com/oauth2callback

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

每件事似乎都没问题吧?但是在我添加一个魔法网址之前它仍然没有用。我添加了 signin-google 网址(这是默认的谷歌回调)没有 < strong> www ,问题解决了。

考虑到它(取决于您的域名)您可能需要也可能不需要添加和不添加www网址

答案 33 :(得分:0)

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

我尝试了对这个问题的所有热门回复,并确认其中没有一个是我的问题。

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

答案 34 :(得分:0)

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

/ oauth2callback

答案 35 :(得分:0)

您需要做的是返回您的开发者控制台并转到API&amp; Auth&gt;同意屏幕并填写。具体来说,就是产品名称。

答案 36 :(得分:0)

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

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

Web应用程序:您需要有效的域名[Redirect URIs:]

答案 37 :(得分:0)

尝试进行这些检查:

  1. 控制台和应用程序中的捆绑ID。我更喜欢设置应用程序的Bundle ID,例如“org.peredovik。$ {PRODUCT_NAME:rfc1034identifier}”
  2. 检查您是否在选项卡上添加了URL类型信息只需在标识符和URL方案中键入您的Bundle ID,将角色设置为编辑器
  3. 在cloud.google.com的控制台中“API&amp; auth” - &gt; “同意屏幕”填写有关您的申请的表格。 “产品名称”是必填字段。
  4. 享受:)

答案 38 :(得分:-3)

更新 - &gt;适用于Android应用

只需使用:

  

http://localhost/oauth2callback

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