在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 。
答案 0 :(得分:341)
重定向URI(返回响应的位置)必须在API控制台中注册,错误表明您没有这样做,或者没有正确完成。
转到项目的控制台,查看API Access。你应该看到你的client ID
& client secret
,以及重定向URI列表。如果未列出所需的URI,请单击编辑设置并将URI添加到列表中。
编辑:(来自下面评价很高的评论)请注意,更新google api控制台并且存在更改可能需要一些时间。通常只有几分钟,但有时似乎更长。
答案 1 :(得分:88)
就我而言,它是www
和non-www
网址。实际网站包含www
网址,Google Developer Console中的授权重定向URI 包含non-www
网址。因此,重定向URI存在不匹配。我通过将Google Developer Console中的Authorized Redirect URIs
更新为www
网址来解决此问题。
其他常见的URI不匹配是:
http://
,在https://
中使用实际网址,反之亦然http://example.com/
)而不使用尾部斜杠(http://example.com
)作为实际网址,反之亦然以下是Google Developer Console的逐步截图,以便对那些难以找到开发者控制台页面来更新重定向URI的人有所帮助。
- 醇>
选择您的项目
- 点击菜单图标
醇>
- 点击
醇>API Manager
菜单
- 点击
醇>Credentials
菜单。在OAuth 2.0 Client IDs
下,您将找到您的客户名称。就我而言,它是Web Client 1
。点击它,会出现一个弹出窗口,您可以在其中编辑授权的Javascript Origin 和授权的重定向URI 。
这是关于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 +正在关闭,此链接可能会消失:
绝对不可原谅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)
清单:
http
或https
?&
或&
?/
)或打开
?(CMD/CTRL)+F
,在凭据页面中搜索完全匹配。如果
找不到,然后搜索遗失的那个。答案 9 :(得分:4)
重定向网址区分大小写。
在我的情况下,我添加了两个: http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync
答案 10 :(得分:3)
答案 11 :(得分:2)
就我而言,我的凭证申请类型是&#34;其他&#34;。因此,我无法在凭据页面中找到Authorized redirect URIs
。它似乎出现在应用程序类型中:&#34; Web应用程序&#34;。但您可以单击Download JSON
按钮获取client_secret.json
文件。
打开json文件,您可以找到如下参数:"redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]
。我选择使用http://localhost,它对我来说很好。
答案 12 :(得分:2)
此答案与this Mike's answer和Jeff's answer相同,都在客户端将redirect_uri
设置为postmessage
。我想添加更多有关服务器端的信息,以及适用于此配置的特殊情况。
create-react-app
版本2.1.5 摘要:React->请求社交身份验证“代码”->请求jwt令牌以您自己的后端服务器/数据库的身份获取“登录”状态。
responseType="code"
的“ Google登录按钮”来获取授权码。 (这不是令牌,不是访问令牌!)
react-google-login
。{ "provider": "google-oauth2", "code": "your retrieved code here", "redirect_uri": "postmessage" }
REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI
中所有REST_SOCIAL_DOMAIN_FROM_ORIGIN
,REST_SOCIAL_OAUTH_REDIRECT_URI
和settings.py
都是不必要的。 (它们是Django REST Social Auth使用的常量)简而言之,您无需在Django中设置与重定向URL相关的任何内容。 React前端中的"redirect_uri": "postmessage"
就足够了。这是有道理的,因为您要做的社交身份验证工作是前端中所有Ajax样式的POST请求,而不提交任何形式,因此默认情况下实际上不发生任何重定向。这就是为什么如果您使用代码+ JWT流,重定向URL变得无用的原因,并且服务器端重定向URL设置没有任何作用。youremailprefix717e248c5b924d60
,则用户名将类似于youremailprefix@example.com
。它附加了一些随机字符串以创建唯一的用户名。这是默认行为,我相信您可以自定义它,并随时了解他们的文档。Authorization
标头中并向后端发送请求,则Django后端现在将将其识别为登录名,即经过身份验证的用户。当然,如果您的令牌已过期,则必须通过再次发出请求来刷新它。我的天哪,我花了6个多小时才终于做到这一点!我相信这是我第一次看到此postmessage
。从事Django + DRF + JWT + Social Auth + React
组合的任何人肯定会崩溃。除了这里的答案,我简直不相信那里的任何文章都提到了这一点。但是我真的希望这篇文章可以为您节省大量时间,如果您使用的是Django + React堆栈。
答案 13 :(得分:2)
请注意网址末尾的额外/
http://localhost:8000
与http://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)
答案 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是不同的
添加所有可能的组合,您可以找到从提琴手发送的确切网址,弹出的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
,分别如下图所示。
注意:您可以为经过验证的域添加多个站点。即适用于您的本地计算机,暂存环境或其他环境
答案 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问题:
建议使用域URL
答案 31 :(得分:0)
我有前端应用程序和后端api。
我从后端服务器通过点击google api进行测试,并且遇到此错误。在我的整个时间里,我想知道为什么我需要给redirect_uri
,因为这只是后端,对于前端来说是有意义的。
我正在做的是从服务器提供不同的redirect_uri
(尽管有效)(假设这只是占位符,只需要向Google注册),但是创建令牌代码的前端URL是不同的。因此,当我在服务器端测试中通过此代码时(重定向uri有所不同),我遇到了此错误。
所以不要犯这个错误。确保您的前端redirect_uri
与服务器的前端相同,因为Google使用它来验证真实性。
答案 32 :(得分:0)
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/authredirect和http://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)
尝试进行这些检查:
享受:)
答案 38 :(得分:-3)