谷歌OAuth 2.0“错误”:重定向URI不匹配。

19

我已经花了一天的时间,打碎了一只玻璃,对此感到非常生气,我不明白谷歌想从我这里得到什么,以及错在哪里。

我已在开发者控制台中启用了Google+ API google_ api enabled , 创建了新的OAuth客户端ID client 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或者存在输入错误时,将出现此错误。但我已经注册了它,并且仅为测试目的尝试设置不同的网址(更改域名,从http更改为https),但它从未起作用!我不知道还有什么可以检查,请至少给予建议。


你是否正在使用 https://github.com/google/google-api-php-client? - Hans Z.
@Hans Z 是的,作为我的Symfony2应用程序的一部分。 - Unstaged
友情提示:在创建凭据时,请选择“Web应用程序”而不是“其他”。我之前选择了“其他”,结果遇到了问题。虽然在本地环境下可以正常工作,但在实际域名上却无法正常运行。 - Nitin Sawant
4个回答

35

3
非常感谢!之前并不明显客户端配置中重定向URL应该是“postmessage”,现在它可以工作了!说明中说postmessage应该是data-redirecturi属性的值,而不是client_config,这很混乱。 - Unstaged
1
另一个需要注意的是,在设置凭据屏幕中的值和登录过程生效之间存在延迟。对我来说,每次更改都需要几分钟的时间才能生效。 - Ads
在我的情况下,它是www。我的URL没有www,而在凭据中我输入了带有www的URL。还要注意http和https。最好输入所有选项。 - Zeni
非常感谢,这对我很有帮助。 - Jaydeep Goswami
这个答案真是救命之恩啊!!我找了两天才找到它。我正在通过Android / JS(确切地说是cordova和https://github.com/EddyVerbruggen/cordova-plugin-googleplus)检索serverAuthCode,并将其发送到PHP以交换访问令牌。当在PHP中直接使用CURL时,“postmessage”是必需的redirect_uri。 - Milk Man
显示剩余2条评论

3

我自己遇到了这个问题。在我的情况下,我的凭证是为一个安装的应用程序设置的,而不是一个Web应用程序。似乎安装的应用程序不能配置重定向URL。我创建了一个新的凭据作为Web应用程序,这使我可以设置一系列重定向URL选项。

遵循此答案和其他答案的建议,我确保URL匹配(复制粘贴),并且对我来说功能正常。我还在隐身窗口中进行了操作。

结果是我的浏览器被重定向到我放置在重定向URL参数中的URL,并带有一个特殊的查询字符串参数code,其中包含下一步使用的代码。


0

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

  1. 出错了。

错误:redirect_uri_mismatch

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

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

确实需要_gcp_gatekeeper/authenticate部分。

谷歌返回400错误是因为重定向URI不匹配。


0

有两个问题:

  1. setRedirectUri 设置为 http,但服务器运行在 https 上且 setAccessType 设置为 online(用于生产环境)
$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"]
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接