在网站 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={scope}
的 URL 来调试此问题,而不是运行整个应用程序进行测试。
重定向 URI(返回响应的位置)必须在 API 控制台中注册,错误表明您没有这样做,或者没有正确完成。
转到项目的控制台并查看 API 访问。您应该会看到您的 client ID
& client secret
以及重定向 URI 列表。如果未列出所需的 URI,请单击编辑设置并将 URI 添加到列表中。
编辑:(来自下面高度评价的评论)请注意,更新 google api 控制台和当前的更改可能需要一些时间。一般只有几分钟,但有时似乎更长。
在我的例子中,它是 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 Developer Console 的分步屏幕截图,以便那些难以找到开发人员控制台页面以更新重定向 URI 的人有所帮助。
转到 https://console.developers.google.com 选择您的项目
https://i.stack.imgur.com/RJfZi.png
点击菜单图标
https://i.stack.imgur.com/xPR5j.png
单击 API 管理器菜单
https://i.stack.imgur.com/VQ9la.png
单击凭据菜单。在 OAuth 2.0 客户端 ID 下,您将找到您的客户端名称。在我的例子中,它是 Web 客户端 1。单击它,将出现一个弹出窗口,您可以在其中编辑 Authorized Javascript Origin 和 Authorized redirect URIs。
https://i.stack.imgur.com/X6rRh.png
注意:Authorized URI 默认包含所有 localhost 链接,任何 live 版本都需要包含完整路径,而不仅仅是域,例如 https://example.com/path/to/oauth/url
这是一篇关于 creating project and client ID 的 Google 文章。
如果您使用 Google+ javascript 按钮,则必须使用 postmessage
而不是实际的 URI。由于谷歌的文档出于某种原因没有明确说明,我几乎花了一整天的时间才弄清楚这一点。
Error: invalid_request
origin parameter is required!
$client->setRedirectUri('postmessage');
而不是 $client->setRedirectUri('http://your.url...');
在您在客户端检索到授权代码的任何流程中,例如 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+ 正在关闭并且此链接可能会消失:
https://i.stack.imgur.com/rFKLj.png
doc page for Offline Access 没有提及这一点是绝对不可原谅的。 #FacePalm
postmessage
,但我想给出这个疯狂的无证黑客何时对我来说是必要的具体情况(例如grantOfflineAccess
)。 :PI 也不希望它是真的。 :) 让我头疼了好几个小时。
postmessage
:通过谷歌自己的Python客户端代码解析后,我终于遇到了这个:“postmessage:字符串,这通常设置为'postmessage'以匹配客户端的redirect_uri指定”此外,在他们的文档中:“默认的 redirect_uri 是当前 URL 去除了查询参数和哈希片段。”这意味着如果您的 redirect_uri
不是当前 url,那么您需要在 gapi.auth2.init()
中明确指定它,并且在服务器端,您将使用 postmessage
。
对于我的网络应用程序,我通过编写纠正了我的错误
instead of : http://localhost:11472/authorize/
type : http://localhost/authorize/
确保检查协议“http://”或“https://”,因为谷歌也检查协议。最好在列表中添加两个 URL。
1.你会看到这样的错误
https://i.stack.imgur.com/8YFfB.png
https://i.stack.imgur.com/PazSa.png
在此之后,您必须复制该网址并将其添加到 https://console.cloud.google.com/
转到 https://console.cloud.google.com/
https://i.stack.imgur.com/gpDSI.png
单击菜单 -> API 和服务 -> 凭证
https://i.stack.imgur.com/KsQOF.png
您会看到这样的仪表板,现在在 Authorized Javascript Origins 和 Authorized redirect URLS 中单击编辑 OAuth Client 添加显示错误的 URL,称为 redirect_uri_mismatch 即这里是 http://algorithammer.herokuapp.com,所以我添加了在 Authorized Javascript Origins 和 Authorized redirect URLS 的两个地方都单击保存并等待 5 分钟,然后尝试再次登录
这似乎很奇怪和烦人,没有“一个”解决方案。对我来说,http://localhost:8000 没有成功,但 http://localhost:8000/ 成功了。
redirect_uri
在开发人员控制台和您的应用程序中必须是 EXACT MATCH。
此答案与 this Mike's answer 和 Jeff's answer 相同,都在客户端将 redirect_uri
设置为 postmessage
。我想添加更多关于服务器端的信息,以及适用于此配置的特殊情况。
技术栈
后端
蟒蛇 3.6
姜戈 1.11
Django REST Framework 3.9:服务器作为 API,不渲染模板,在其他地方没有做太多。
Django REST 框架 JWT 1.11
Django REST 社交认证 < 2.1
前端
React:16.8.3,create-react-app 版本 2.1.5
反应谷歌登录:5.0.2
“代码”流程(专门针对 Google OAuth2)
摘要: React --> 请求社交身份验证“代码”-> 请求 jwt 令牌以根据您自己的后端服务器/数据库获取“登录”状态。
前端(React)使用带有 responseType="code" 的“Google 登录按钮”来获取授权码。 (不是令牌,不是访问令牌!) 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 从前端接收代码,用谷歌的服务验证它(为你完成)。验证后,它将 JWT(令牌)发送回前端。前端现在可以获取令牌并将其存储在某处。 Django 的 settings.py 中的所有 REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI、REST_SOCIAL_DOMAIN_FROM_ORIGIN 和 REST_SOCIAL_OAUTH_REDIRECT_URI 都是不必要的。 (它们是 Django REST Social Auth 使用的常量)简而言之,您不必在 Django 中设置与重定向 url 相关的任何内容。 React 前端中的 "redirect_uri": "postmessage" 就足够了。这是有道理的,因为你必须在你身边做的社交身份验证工作都是前端的 Ajax 风格的 POST 请求,不提交任何表单,所以默认情况下实际上不会发生重定向。这就是为什么如果您使用代码 + JWT 流程,重定向 url 将变得无用,并且服务器端重定向 url 设置没有任何效果。 Django REST Social Auth 处理帐户创建。这意味着它将检查 google 帐户电子邮件/姓氏,并查看它是否与数据库中的任何帐户匹配。如果没有,它会为您创建一个,使用确切的电子邮件和名字。但是,如果您的电子邮件是 yourremailprefix@example.com,则用户名将类似于 yourremailprefix717e248c5b924d60。它附加一些随机字符串以创建唯一的用户名。这是默认行为,我相信您可以自定义它并随意深入研究他们的文档。前端存储该令牌,并且当它必须对后端服务器执行 CRUD 时,尤其是创建/删除/更新,如果您在授权标头中附加令牌并向后端发送请求,Django 后端现在会将其识别为登录,即经过身份验证的用户。当然,如果您的令牌过期,您必须通过发出另一个请求来刷新它。
哦,我的天哪,我已经花了 6 个多小时终于搞定了!我相信这是我第一次看到这个 postmessage
的东西。任何使用 Django + DRF + JWT + Social Auth + React
组合的人肯定会遇到这种情况。我不敢相信那里的文章都没有提到这一点,除了这里的答案。但如果你使用 Django + React 堆栈,我真的希望这篇文章可以为你节省大量时间。
https://i.stack.imgur.com/K9Fz7.png
打开json文件,可以找到类似这样的参数:"redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]
。我选择使用 http://localhost,它对我来说很好用。
当您在 https://code.google.com/apis/console 注册您的应用程序并创建一个客户端 ID 时,您有机会指定一个或多个重定向 URI。您的身份验证 URI 上的 redirect_uri
参数的值必须与其中之一完全匹配。
清单:
http 还是 https?
& 或 &?
尾部斜杠(/)或打开?
(CMD/CTRL)+F,在凭证页面中搜索完全匹配。如果找不到,则搜索丢失的那个。
等到谷歌刷新它。如果您经常更换,则可能每半小时发生一次,或者它可能会留在游泳池中。就我而言,几乎是半小时生效。
如果您使用本教程:https://developers.google.com/identity/sign-in/web/server-side-flow,那么您应该使用“postmessage”。
在 GO 中,这解决了问题:
confg = &oauth2.Config{
RedirectURL: "postmessage",
ClientID: ...,
ClientSecret: ...,
Scopes: ...,
Endpoint: google.Endpoint,
}
注意网址 http://localhost:8000
末尾的额外 /
与 http://localhost:8000/
不同
对我来说,这是因为在“授权重定向 URI”列表中,我错误地放置了 https://developers.google.com/oauthplayground/
而不是 https://developers.google.com/oauthplayground
(最后没有 /
)。
它已经得到了彻底的回答,但最近(比如一个月前)谷歌停止接受我的 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,这样您就知道要重定向到哪里
2015 年 7 月 15 日 - 上周在登录时使用此脚本的登录
<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>
重定向 URL 区分大小写。
就我而言,我同时添加了:http://localhost:5023/AuthCallback/IndexAsync http://localhost:5023/authcallback/indexasync
Rails 用户(来自 omniauth-google-oauth2 文档):
修复 Rails 中 redirect_uri 的协议不匹配 只需根据 Rails.env 在 OmniAuth 中设置 full_host。 # config/initializers/omniauth.rb OmniAuth.config.full_host = Rails.env.production? ? 'https://domain.com' : 'http://localhost:3000'
记住:不要包含尾随的“/”
以上解决方案都不适合我。下面做了
将授权的重定向 URL 更改为 - https://localhost:44377/signin-google
希望这可以帮助某人。
我的问题是我在地址栏中有 http://localhost:3000/ 并且在 console.developers.google.com 中有 http://127.0.0.1:3000/
https://i.stack.imgur.com/da1dy.png
https://i.stack.imgur.com/0z4ry.png
只需确保您输入的是 URL 而不仅仅是域。因此,而不是: domain.com 它应该是 domain.com/somePathWhereYouHadleYourRedirect
任何人都在努力寻找在新控制台中设置重定向 URL 的位置:APIs & Auth -> Credentials -> OAuth 2.0 client IDs -> 单击链接以查找所有重定向 URL
我的两分钱:如果使用 Google_Client 库,请不要忘记在更新重定向 URI 后更新服务器上的 JSON 文件。
我需要在 APIs & Services -> Credentials -> Create credentials -> OAuth -> Other 下创建一个新的客户端 ID
然后我下载了 client_secret.json 并将其与正在上传到我的 youtube 帐户的命令行程序一起使用。我试图使用 Web App OAuth 客户端 ID,它在浏览器中给了我重定向 URI 错误。
我有前端应用程序和后端 API。
在我的后端服务器上,我通过点击 google api 进行测试并面临这个错误。在我的整个时间里,我一直在想为什么我需要提供 redirect_uri
因为这只是后端,对于前端来说它是有道理的。
我正在做的是从服务器提供不同的 redirect_uri
(虽然有效)(假设这只是占位符,它只需要注册到谷歌)但我创建令牌代码的前端 url 是不同的。因此,当我在服务器端测试中传递此代码时(redirect-uri 不同),我遇到了这个错误。
所以不要犯这个错误。确保您的前端 redirect_uri
与您的服务器相同,因为 google 使用它来验证真实性。
此问题的主要原因将仅来自 chrome 和 chrome 处理 WWW 和非 www 的方式不同,具体取决于您在浏览器中输入 URL 的方式,它从 google 搜索并直接显示结果,因此发送的重定向 URL 在不同的案子
https://i.stack.imgur.com/btOP7.png
添加所有可能的组合,您可以找到从 fiddler 发送的确切 url,弹出的 400 错误不会为您提供确切的 http 和 www 信息
尝试进行以下检查:
控制台和应用程序中的捆绑 ID。我更喜欢像这样“org.peredovik.${PRODUCT_NAME:rfc1034identifier}”设置应用程序的捆绑 ID 检查您是否在选项卡信息中添加了 URL 类型,只需在标识符和 URL 方案中输入您的捆绑 ID,角色设置为云控制台中的编辑器。 google.com "APIs & auth" -> "Consent screen" 填写关于您的应用程序的表格。 “产品名称”是必填字段。
享受 :)
让我完成@Bazyl 的回答:在我收到的消息中,他们提到了 URI "http://localhost:8080/"
(当然,这似乎是谷歌的内部配置)。我更改了那个 "http://localhost:8080/"
的授权 URI,并且消息不再出现...视频已上传... APIS 文档非常蹩脚...每次我有一些使用 google apis 的东西,我只是觉得“幸运”,但缺乏关于它的良好文档.... :( 是的,我让它工作了,但我还不明白它为什么失败,也不明白为什么它工作......那里只是在网络上确认 URI 的一个地方,它被复制到 client_secrets.json 中......我不明白是否有第三个地方应该写相同的 URI......我发现也不只有文档而且Google的api的GUI设计也很蹩脚...
就我而言,我必须检查 Web 应用程序/已安装应用程序的客户端 ID 类型。
已安装的应用程序:http://localhost [重定向 URI] 在这种情况下 localhost 可以正常工作
Web 应用程序:您需要有效的域名 [重定向 URI:]