不幸的是,我得到了错误消息:
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。
/>
#1 楼
重定向URI(返回响应的位置)必须在API控制台中注册,并且错误表明您尚未执行此操作或未正确执行操作。转到转到项目的控制台,然后在“ API访问”下查看。您应该在此处看到
client ID
和client 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 楼
在我的情况下,它是www
和non-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_ORIGIN
,REST_SOCIAL_OAUTH_REDIRECT_URI
和settings.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 楼
检查清单:http
或https
?&
或&
?斜杠(
/
)或打开
?>
(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:8000
与http://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 ,不匹配错误消失了。
评论
对于其他遇到此问题的人,请注意,您可以通过访问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本身自动重定向。