在网站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 omniauth-google-oauth2。
/>

评论

对于其他遇到此问题的人,请注意,您可以通过访问https://accounts.google.com/o/oauth2/auth?client_id= {client_id}&response_type = token&redirect_uri = {redirect_uri}&scope = {范围},而不是运行整个应用进行测试。

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

#1 楼

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

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

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

评论


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

–user984621
2012年7月14日在17:33

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

–海豚
2012年10月2日15:53

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

– David L
2014年8月22日14:36

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

–邓克
15年1月6日,11:00

google没有在“ Api&Auth>凭据”中在google控制台中提供重定向uri的选项,无论我创建新的客户端ID还是生成新密钥都没有关系,根本无法通过以下方式指定重定向uri:谷歌控制台。

–user3338098
15年3月9日在19:38

#2 楼

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

其他常见的URI不匹配是:


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

Google开发者控制台的分步屏幕截图,对于那些难以找到开发者控制台页面以更新重定向URI的人来说将很有帮助。




转到https ://console.developers.google.com
选择您的项目







单击菜单图标







单击API Manager菜单







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





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

评论


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

– Winna
16年1月28日在10:45

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

–艾伦
16 Mar 9 '16 at 10:37

我将“授权JavaScript起源”保留为空,将“授权重定向URI”保持为127.0.0.1/google_account/authentication,它对我有效。

–克里希
16年4月13日在10:59

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

– LatentDenis
16年5月18日在18:35

对于那些为此苦苦挣扎的人,如果您通过其他Google页面(例如Drive API页面)创建了应用,则可能看不到这些选项。我必须从API Manager控制台中删除并重新创建客户端ID。

–tgun926
18年7月25日在11:49

#3 楼

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

评论


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

–罗布·怀特塞德
2014年2月27日在8:32



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

–user2998553
2014年6月22日18:50

postmessage听起来不错,但会导致无用的错误:invalid_request origin参数是必需的!

–user3338098
2015年3月9日19:42

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

–瓜卡拉(Guicara)
16 Mar 9 '16 at 13:40

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

– djthoms
16年6月30日在20:23

#4 楼

现在,在您从客户端检索授权代码(例如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的Google文档就是该旧版Google+登录文档。这是一个截图和存档链接,因为G +关闭了,该链接很可能会消失:



绝对不可原谅的是,离线访问的文档页面没有提及这个。 #FacePalm

评论


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

– Mariobgr
18年3月22日在19:39

@mariobgr是的,这里的其他答案都提到了postmessage,但是我想给出具体的情况(例如,grantOfflineAccess),这种疯狂的无证黑客对我来说是必要的。 :P我也不希望它是真的。 :)花了我几个小时的头痛。

–杰夫·沃德(Jeff Ward)
18 Mar 22 '18在20:07

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

–ernbrn
18年5月4日在18:51

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

– Glade
19 Mar 6 '19 at 3:29

令人难以置信但真实的... O__o

– mlb
19年8月15日在18:44

#5 楼

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

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

纠正了我的错误。

评论


感谢分享,对您有所帮助。我之所以陷入困境,是因为GitHub OAuth2 API不需要您删除端口号。

– florisla
16 Mar 15 '16 at 13:36

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

– FrenkyB
16年5月31日在15:41

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

–亚历杭德罗(Alejandro Lozdziejski)
16年7月10日在2:49

谢谢,这也对我有用。只需放下端口! :)

– vidstige
17年9月24日在14:18

#6 楼

确保检查协议“ http://”或“ https://”,就像Google还要检查协议一样。
最好在列表中添加两个URL。

评论


我希望两个小时前已经滚动到您的答案

– BiAiB
15年9月28日在12:08

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

–布拉德·科赫(Brad Koch)
16年11月16日在16:12



#7 楼

这似乎很奇怪和令人讨厌,因为没有“一个”解决方案。
对我来说http:// localhost:8000不能解决,但http:// localhost:8000 /可以解决。

评论


这是因为redirect_uri在开发人员控制台和您的应用程序中必须是完全匹配。

–tony gil
15年7月15日在16:22

#8 楼

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

技术堆栈

后端



Python 3.6
Django 1.11

Django REST Framework 3.9:服务器作为API,不呈现模板,在其他地方不做很多事情。

Django REST Framework JWT 1.11

Django REST Social Auth <2.1

前端



反应:16.8.3,create-react-app版本2.1.5

react-google-login:5.0.2

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

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


前端(反应)使用“ Google登录按钮”与responseType="code"一起获得授权码。 (不是令牌,不是访问令牌!)


google登录按钮来自上述的react-google-login
单击该按钮将弹出一个弹出窗口,供用户选择帐户。用户选择一个并且窗口关闭后,您将从按钮的回调函数中获取代码。


前端将其发送到后端服务器的JWT端点。


POST请求,带有{ "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }



对于我的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中设置与重定向网址相关的任何内容。 React前端中的"redirect_uri": "postmessage"就足够了。这是有道理的,因为您要做的社交身份验证工作是前端中所有Ajax样式的POST请求,而不提交任何形式,因此默认情况下实际上不发生任何重定向。这就是为什么如果您使用代码+ JWT流时重定向URL变得无用,并且服务器端重定向URL设置没有任何效果的原因。

Django REST Social Auth处理创建帐户。这意味着它将检查google帐户的电子邮件/姓氏,并查看它是否与数据库中的任何帐户匹配。如果没有,它将使用准确的电子邮件和姓氏为您创建一个。但是,如果您的电子邮件地址是youremailprefix717e248c5b924d60,则用户名将类似于youremailprefix@example.com。它附加了一些随机字符串以创建唯一的用户名。这是默认行为,我相信您可以自定义它,并随时查看他们的文档。
前端存储该令牌,以及何时必须对后端服务器执行CRUD,尤其是在创建/删除/更新时(如果您将令牌附加到Authorization标头中并将请求发送到后端,Django后端现在将识别为登录名,即经过身份验证的用户。当然,如果您的令牌已过期,则必须再次发出请求以刷新令牌。

天哪,我已经花了6个多小时才终于做到这一点!我相信这是我第一次看到这个Q4312079Q。任何使用postmessage组合的人肯定会崩溃。除了这里的答案,我简直不相信那里的任何文章都提到了这一点。但是我真的希望这篇文章可以为您节省大量时间,如果您使用的是Django + React堆栈。

#9 楼

检查清单:


httphttps

&&amp;
斜杠(/)或打开

> (CMD/CTRL)+F,在凭证页面中搜索完全匹配。如果未找到
,则搜索缺少的那个。
等到谷歌刷新它。如果您
经常更换,可能会在每半小时内发生一次,否则可能会留在游泳池里。就我而言,这几乎要花半个小时。


评论


那该死的斜线引起了我的混乱。

– alextsil
10月29日8:40

#10 楼

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

评论


由于Google并不同意[landed1.github.io/videos.html#/oauth2callback]是有效的网址,因此它在非常深的基于Angular的链接方面存在问题

–降落
2014年1月23日15:41

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

–安东尼·孔(Anthony Kong)
2015年9月9日在23:58

感谢@AnthonyKong更新。我已将网址更改为一个。请现在检查。

–加西尔
2015年9月10日下午6:20

#11 楼

2015July15-上周在登录时使用此脚本进行登录的操作

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


停止工作,并通过Error: redirect_uri_mismatch

并在其中导致错误400详细信息部分:redirect_uri=storagerelay://...

我通过更改为:

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

解决了它

评论


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

–尼克·史派克(Nick Spacek)
2015年9月3日14:45在

@NickSpacek请检查是否缺少双引号。

–tony gil
2015年9月3日20:20在

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

– LatentDenis
16年5月18日在18:35

#12 楼

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


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

评论


请帮助我stackoverflow.com/questions/41270512/…

–坚不可摧
16年12月22日在5:21

#13 楼

重定向网址区分大小写。

我添加了以下两个内容:
http:// localhost:5023 / AuthCallback / IndexAsync
http:// localhost:5023 / authcallback / indexasync

评论


并注意URL末尾的字符“ /”。有时需要,而其他时候则不需要。

–ajmena
16-10-13在11:34

这样我们就可以将本地主机保留为request_uri,即使是在线网站也可以?

–坚不可摧
16年12月22日在5:20

#14 楼

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

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

希望对别人有帮助。

评论


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

–坚不可摧
16 Dec 22'在5:19

#15 楼

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

在GO中,此问题已修复问题:

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


#16 楼

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

评论


这就是帮助我的原因:)

–雅克(JacekGóraj)
18年11月13日在20:29

#17 楼

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


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

只需基于Rails在OmniAuth中设置full_host .env。

#config / initializers / omniauth.rb

OmniAuth.config.full_host = Rails.env.production? ? 'https://domain.com':'http:// localhost:3000'


记住:请勿包含结尾的“ /”

#18 楼

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

#19 楼

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

#20 楼

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

评论


如果我能投票赞成1000次...

–伊万·诺科诺科(IvánNokonoko)
11月8日15:09

#21 楼

让我完成@Bazyl的回答:在收到的消息中,他们提到了URI
"http://localhost:8080/"
(当然,这似乎是Google的内部配置)。我更改了该URL的授权URI,
"http://localhost:8080/",消息不再出现...并且视频被上传... APIS文档非常la脚...每次我有工作需要google api,我只是感到“幸运”,但是缺少关于它的很好的文档.... :(是的,我让它工作了,但是我仍然不明白为什么它失败了,也为什么不起作用.. 。在网络上只有一个地方可以确认URI,然后将其复制到client_secrets.json中...如果某个地方应该写相同的URI,我不知道。 Google api的文档以及GUI设计都很la脚...

评论


您发布的两个URI看起来相同。你什么意思?

–mLstudent33
11月14日7:03

#22 楼

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

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

#23 楼

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

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

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

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

评论


我有一个React前端和一个Flask后端,这个答案解决了我的问题。谢谢

–乔·加塞维兹(Joe Gasewicz)
11月24日17:17

#24 楼

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



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

#25 楼

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



#26 楼

尝试执行以下检查:


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

享受:)

#27 楼

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

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

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

#28 楼

您需要做的是回到开发人员控制台,然后转到“ API和身份验证”>“同意屏幕”,然后填写。具体来说就是产品名称。

评论


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

– florisla
16 Mar 15 '16 at 14:07

#29 楼

不要忘记在您的域和IP之后添加路径。就我而言,我忘记了:

/ oauth2callback

评论


请帮助我stackoverflow.com/questions/41270512/…

–坚不可摧
16年12月22日在5:22

#30 楼

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

我尝试了所有对该问题的最高答复,并确认它们都不是我的问题。

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