Google OAuth 2.0“错误”:“redirect_uri_mismatch”

Posted

技术标签:

【中文标题】Google OAuth 2.0“错误”:“redirect_uri_mismatch”【英文标题】:Google OAuth 2.0 "error" : "redirect_uri_mismatch" 【发布时间】:2015-04-03 23:40:15 【问题描述】:

我已经花了一天时间,摔碎了一个玻璃杯,我真的很生气,我不明白谷歌想从我这里得到什么,出了什么问题。

我已在开发者控制台中启用 Google+ Api , 创建了新的 OAuth 客户端 ID

    $ch = curl_init('https://accounts.google.com/o/oauth2/token');
curl_setopt($ch,CURLOPT_POSTFIELDS,'code=4%2FPp1GWqC6PIr3wNYrZ5kK4T9oitxBoo0fBqBrVNQfE-g.ElKDUjQ7E28SoiIBeO6P2m-0RPaolgI&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fmyprivatedomain.local.com%2Foauth2callback&client_id=%mycliet_id%&client_secret=%mysecret%');
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
var_dump(curl_exec($ch));

按照这里的说明创建:https://developers.google.com/+/web/signin/server-side-flow,页面上出现 gplus 按钮,它成功地请求授权用户访问。但是当我进行第 8 步时 第 8 步:初始化 Google API 客户端库并启动 Google+ 服务 我的请求每次得到响应 "error" : "redirect_uri_mismatch"

我知道,当您没有在 Google Console 中注册 redirect_uri,或者您在其中输入错误时会出现此错误,但我注册了它,并且也只是为了测试尝试设置不同的 url(更改域名,将协议从 https 更改为 https),但它从来没有工作!我不知道我还能检查什么,请至少提供一些建议。

【问题讨论】:

你在用github.com/google/google-api-php-client吗? @Hans Z 是的,作为我的 symfony2 应用程序的一部分 Friendly Note: 在创建凭据时选择“Web 应用程序”而不是“其他”,我选择了“其他”并遇到了问题,它在本地工作但在实时域中没有工作 【参考方案1】:

文档在第 1 步中说。https://developers.google.com/+/web/signin/server-side-flow#step_1_create_a_client_id_and_client_secret 必须没有配置重定向 URI,只有“授权的 javascript 来源”。在授权请求和令牌交换中,redirect_uri参数值应设置为postmessage

编辑: 现有技术:Google OAuth 2 authorization - Error: redirect_uri_mismatch

【讨论】:

非常感谢!显然客户端配置中的重定向 url 应该是“postmessage”,它现在可以工作了!指令说postmessage应该是属性data-redirecturi的值,而不是client_config,那是一团糟 另外需要注意的是,在凭据屏幕中设置值与它们生效并且登录过程正常工作之间存在延迟。对我来说,每次我改变一些东西都是几分钟。 花了几个小时试图解决这个问题后,你的回答对我帮助很大!谷歌文档不是很清楚。在服务器端,如果您使用 Google API 客户端库,您应该使用此代码:$client->setRedirectUri('postmessage'); 而不是 $client->setRedirectUri('http://your.url...'); 在我的例子中是 www。我的 URL 没有 www,而在凭据中我输入带有 www 的 URL。还要注意http和https。最好输入所有选项。 非常感谢......它帮助了我。【参考方案2】:

我自己也遇到了这个问题。就我而言,我的凭据是为已安装的应用程序设置的,不是网络应用程序。 Installed applications 好像不能用redirect URLs 配置。我创建了一个新凭证作为web application,这让我可以选择设置一系列redirect urls。

按照这个和其他答案的建议,我确保 URL 匹配(复制粘贴)并且这对我来说是正确的。我也在隐身窗口中这样做了。

结果是我的浏览器被转发到我在 redirect_url 参数中输入的 URL,并带有一个特殊的查询字符串参数 code,其中填充了用于下一步的代码。

【讨论】:

【参考方案3】:

如果在使用 Google IAP 时看到此内容,如果您尝试在浏览器中访问您的 URL,您将收到以下消息:

    这是一个错误。

错误:redirect_uri_mismatch

请求中的重定向 URI [your_url]/_gcp_gatekeeper/authenticate 与授权给 OAuth 客户端的不匹配。要更新授权的重定向 URI,请访问:https://console.developers.google.com/apis/credentials/oauthclient/?project=[your_project_id]

如果您访问它提供给您的 URL(或间接通过 the console >> 单击正确的“OAuth 2.0 客户端 ID”上的编辑),请在“授权重定向 URI”部分中,确保您拥有 [your_url]/_gcp_gatekeeper/authenticate网址设置。

_gcp_gatekeeper/authenticate 部分绝对是必需的。

由于重定向 URI 不匹配,Google 返回 400 错误。

【讨论】:

【参考方案4】:

有两个问题:

    setRedirectUri 设置为 http 并且服务器在 https 上运行并且 将AccessType 设置为在线(用于生产)
$client = new Google_Client();
$client->setAuthConfig(_DIR_ . '/../public/client_secrets.json');
$client->setRedirectUri('https://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->setAccessType('online');
$client->addScope('https://www.googleapis.com/auth/analytics.readonly');
    在我的身份验证配置文件 (client_secrets.json) 中。我改变了 redirect_uris、client_id、project_id 和 client_secret

"web":
  "client_id":"GOOGLE_CLIENT_ID",
    "project_id":"PROJECT_ID",
    "auth_uri":"https://accounts.google.com/o/oauth2/auth",
    "token_uri":"https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
    "client_secret":"CLIENT_SECRET",
    "redirect_uris":["https://DOMAIN_NAME.com/social-auth/google/callback",
              "http://localhost:8000/oauth2callback.php"],
  "javascript_origins":["https://localhost","http://localhost:8000"]
    

【讨论】:

以上是关于Google OAuth 2.0“错误”:“redirect_uri_mismatch”的主要内容,如果未能解决你的问题,请参考以下文章

尝试切换开关以在 Google APIS Explorer 中使用 OAuth 2.0 授权请求返回 500 错误

Google Gmail API OAuth 2.0 错误 400:redirect_uri_mismatch

OAuth 2.0 学习

Google OAuth 2.0 得到错误 400:redirect_uri_mismatch,ASP.net core 3.1

具有公共访问权限的 Web 应用程序的 Google OAuth 2.0 刷新令牌

Google OAuth 2.0 invalid_request,缺少方案