Google OAuth 2授权-错误:redirect_uri_mismatch


385

在网站https://code.google.com/apis/console上,我已经注册了我的应用程序,将生成的Client ID:Client Secret设置到我的应用程序,并尝试使用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 omn​​iauth-google-oauth2


对于任何其他遇到此问题的人,请注意,您可以通过访问URL(例如https://accounts.google.com/o/oauth2/auth?client_id={client_id}&response_type=token&redirect_uri={redirect_uri}&scope={scope}在浏览器中)来调试此问题,而不用运行整个应用程序进行测试。
杰克M

我注意到,google自动在URL的(redirect_uri =“ whatever”)中的双引号中绑定redirect_uri,并导致此错误。如果删除双引号,则可以进入下一个屏幕。现在,我们如何避免使用双引号,因为它会被Google本身自动重定向。
Abhishek Soni

Answers:


388

重定向URI(返回响应的位置)必须在API控制台中注册,并且该错误表明您尚未执行此操作或未正确执行操作。

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

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


9
这是一种魔术,因为当我在一小时前尝试相同的回调时,它没有用,但现在可以用了。还是谢谢你!
user984621

337
遇到类似的问题,并想指出,更新google api控制台并进行更改可能需要一些时间。通常只有几分钟,但有时似乎更长。
sdolphin 2012年

31
让我完成@Bazyl的回答:在收到的消息中,他们提到了URI“ localhost:8080 ”(当然,这似乎是Google的内部配置)。我更改了该URL的授权URI“ localhost:8080 ”,消息不再出现...并且视频被上传... APIS文档非常la脚...每次我有工作需要时google api,我只是感到“幸运”,但是缺少关于它的良好文档.... ::
David L

7
在浏览器中打开一个私人/隐身窗口,然后重试。有时,这可以解决缓存问题。
2015年

17
google在“ Api&Auth>凭据”中的google控制台中没有用于重定向uri的选项,无论我创建新的客户ID还是生成新密钥都没有关系,根本无法从中指定重定向uri谷歌控制台。
user3338098 2015年

114

在我的情况下,它是wwwnon-wwwURL。实际站点具有wwwURL,而Google Developer Console中的授权重定向URI具有non-wwwURL。因此,重定向URI不匹配。我通过Authorized Redirect URIs在Google Developer Console中更新为wwwURL 来解决了该问题。

其他常见的URI不匹配是:

  • http://在授权重定向URI中使用,并https://作为实际URL使用,反之亦然
  • 使用尾部的斜杠(http://example.com/在授权重定向的URI),而不是使用斜线(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 URI

选择凭据菜单

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


9
由于它提供了真实的答案,因此确实需要将该答案推得更高。我们遇到了完全相同的问题,这有助于解决问题-谢谢!
温娜

4
我的问题是我知道该怎么做,但不知道在UI中的哪里可以找到它。此处的屏幕截图有所帮助。谢谢。
艾伦

3
我将Authorized JavaScript origins保留为空,并将Authorized redirect URIs保留为127.0.0.1/google_account/authentication,它对我有效。
克里希

1
您能帮我解决我的问题吗?stackoverflow.com/questions/37307612/…–
LatentDenis


91

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


8
由于在查询错误消息时此问题是最热门的问题,因此这里有一些其他指针。正如Mike所说,对您的重定向URI使用“ postmessage”。您需要在2个地方进行指定(如果您使用的是web-app-server-flow)。一个是在javascript的g登录按钮中。另一个位于服务器代码中的图章授权客户端中。
罗伯·怀特塞德

好答案。我正在使用javascript发布,需要在Google API config.php文件中设置'oauth2_redirect_uri'=>'postmessage'。
user2998553 2014年

4
postmessage听起来不错,但会导致无用Error: invalid_request origin parameter is required!
user3338098 2015年

10
花了几个小时尝试解决此问题后,您的回答对我有很大帮助!Google文档不是很清楚。在服务器端,如果您使用Google API客户端库,则应使用以下代码:$client->setRedirectUri('postmessage');而不是$client->setRedirectUri('http://your.url...');
Guicara

3
哇.... @Guicara解决方案在将我的头撞在墙上数小时后为我工作。
djthoms

52

在您从客户端检索到授权代码(例如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 DOC

脱机访问文档页面没有提及这一点是绝对不可原谅的。#FacePalm


1
真该死,您的帖子似乎完全不合逻辑,但这是唯一起到吸引力的作用。非常感谢,伙计!
mariobgr

@mariobgr是的,这里提到了其他答案postmessage,但是我想给出具体的情况(例如grantOfflineAccess),何时需要对我进行这种疯狂的无证黑客入侵。:PI也不希望它是真的。:)花了我几个小时的头痛。
杰夫·沃德

谢谢!这正是我所需要的。
恩布恩

这需要引起Google的注意。这绝对是可怕的。
沼地

令人难以置信,但却是事实...... O__O
美国职棒大联盟

41

对于我的Web应用程序,我通过写来纠正了我的错误

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

感谢分享,对您有所帮助。我被困在这一点,因为在GitHub上的OAuth2 API并没有要求你删除的端口号。
florisla

这也对我有用。我正在遵循这门课程:asp.net/mvc/overview/security/…,并收到“重定向uri错误”。将localhost:44334 / signin-google更改为localhost / signin-google后,它可以工作了。非常感谢您提供有用的提示。
FrenkyB '16

1
非常感谢。我正在使用此github.com/google/google-api-dotnet-client-samples进行测试,每次运行该请求时,“请求中的重定向URI”似乎都来自不同的端口。这对我有很大帮助。弄清楚正在发生的事情要花几个小时!
Alejandro Lozdziejski '16

谢谢,这也为我工作。只需放下端口!:)
vidstige

31

确保检查协议“ http://”或“ https://”,因为Google也会检查协议。最好将两个URL都添加到列表中。


10
我希望我能在两个小时前滚动到您的答案
BiAiB

1
不,最好只是确保您使用的是https。
Brad Koch


6

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


正是由于这个领域,基于Angular的深层链接存在问题,因为Google并不同意[ landed1.github.io/videos.html#/oauth2callback]是有效的网址
登陆

2
该网址似乎https://code.google.com/apis/console不再有效
Anthony Kong

感谢@AnthonyKong的更新。我已将网址更改为一个。请现在检查。
卡希尔(Kathir)2015年

6

这个答案是一样的这个麦克的回答,和杰夫的回答,这两组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从前端接收代码,并通过Google的服务进行验证(为您完成)。验证后,它将把JWT(令牌)发送回前端。前端现在可以收获令牌并将其存储在某个地方。
    • 所有的REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URIREST_SOCIAL_DOMAIN_FROM_ORIGINREST_SOCIAL_OAUTH_REDIRECT_URI在Django的settings.py是不必要的。(它们是Django REST Social Auth使用的常量)简而言之,您无需在Django中设置与重定向url相关的任何内容。将"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堆栈。


5

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

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

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

并在“详细信息”部分中: redirect_uri=storagerelay://...

我通过更改为解决了:

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

遇到相同的错误400,但更改脚本在我的Cordova WebView内部不起作用。
Nick Spacek 2015年

@NickSpacek请检查是否遗漏了双引号。
托尼·吉尔

你能帮我解决我的问题吗?stackoverflow.com/questions/37307612/…–
LatentDenis

5

清单:

  • http还是https
  • &还是&amp;
  • 尾部斜杠(/)还是打开
  • (CMD/CTRL)+F,在凭证页面中搜索完全匹配。如果找不到,则搜索丢失的一个。
  • 等到谷歌刷新它。如果您经常更改,则可能每半小时发生一次,或者可能停留在游泳池中。就我而言,这几乎要花半个小时。

4

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

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




4

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

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

希望这对某人有帮助。


如果我们使用本地主机,它将也适用于已发布的网站。我的意思是,如果在API控制台中添加了localhost请求URI。网站上线时它将如何工作?还是对于实时站点,我们需要在API控制台中放置另一组实际的URI?
坚不可摧的




2

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


1

让我完成@Bazyl的回答:在收到的消息中,他们提到了URI "http://localhost:8080/" (当然,它似乎是Google内部的配置)。我更改了该URI的授权URI "http://localhost:8080/",消息不再出现...并且视频上传了... APIS文档非常la脚...每次我使用谷歌api进行操作时,我都会感到“幸运”,但是缺少有关它的文档....::(是的,我可以使用它,但是我仍然不明白为什么它失败了,或者为什么它无法工作...只有一个在Web上确认URI的地方,并且将其复制到client_secrets.json中。如果有一个应该写入相同URI的第三地方,我不知道。我不仅找到文档,而且找到Google的GUI设计


1

任何人都在新控制台中苦苦寻找在哪里设置重定向URL的地方:API和Auth->凭据-> OAuth 2.0客户端ID->单击链接以查找所有重定向URL


1

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

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


0

尝试执行以下检查:

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

请享用 :)


0

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

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

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


0

您需要做的是回到开发人员控制台,然后转到“ APIs&Auth”>“同意屏幕”并填写。具体来说就是产品名称。


另外,请勿使用在另一个项目中也使用过的产品名称。确保它是唯一的。
florisla



0

我在使用Google登录时遇到了同样的问题,我正要拔头发!!!我已经在Google开发人员控制台的google凭据面板中正确输入了回调,这是我的重定向网址:

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

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

https://www.example.com/oauth2callback

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

每件事看起来都很好吧?但直到我添加了一个神奇的网址,然后又添加了Signin-google url(这是默认的Google回调)后,它仍然无法工作, www没有解决。

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


0

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

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

我在做什么是redirect_uri与服务器提供不同的(尽管有效的)(假设这只是占位符,只需要向Google注册),但是创建令牌代码的前端URL是不同的。因此,当我在服务器端测试中传递此代码时(针对它的redirect-uri有所不同),我遇到了此错误。

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


0

错误原因如下:发生redirect_uri_mismatch问题:

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

建议使用域URL


Google应该一直生成错误的redirect_uri参数,该怎么办?它以带有随机端口号的localhost:XXXXX生成,而忽略了我设置的创建客户端的重定向uri。
A. Makarevich

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.