这是我的问题。我在带有自定义图片的页面上有一个Google Plus链接。网址是
https://accounts.google.com/o/oauth2/auth?client_id=' 。 Zend_Registry :: get(' config') - > googlePlus-> client_id。 '&安培; REDIRECT_URI =' 。 urlencode($ strRedirectUrl)。 '&安培; ACCESS_TYPE =离线&安培; RESPONSE_TYPE =代码&安培;范围=' 。 urlencode(' https://www.googleapis.com/auth/plus.login')。 '&安培;' 。 进行urlencode(' https://www.googleapis.com/auth/plus.me&#39)
客户端ID和重定向是动态传递的。 (此链接由PHP函数生成。)
用户点击链接并通过Google进行身份验证。现在我需要将它们记录到我的应用程序中。似乎从服务器返回的唯一事情是身份验证代码。我不知何故需要Google_Client
我可以获取用户信息。当我建立客户端以满足Google的所有要求时,我遇到了一个问题,即我试图重用代码。我想我已经找到了解决方法。
然而,会发生什么,得到redirect_uri_mismatch
。广泛的谷歌搜索说这是因为URI不在我的开发者控制台中。但确实如此。我已经四倍检查了它,它完全一样。没有特殊的端口或斜杠或任何东西。所以我无法弄清楚为什么我会收到这个错误。
是不是因为我在上面的链接中传入了redirect_uri,然后在下面指定一个?我注意到如果我使两个redirect_uris相同,redirect_uri错误消失了,但是我得到一个错误,代码已经被兑换了。我猜是因为它骑自行车回到原来的位置。无论如何,我不能让两者相同,因为我需要不同的浏览器来浏览我的代码。
(以下所有Zend_Registry值都已确认。此函数返回一个字符串,即必要的API密钥。)
$client = new Google_Client();
$client->setApplicationName('Web Application');
$client->setClientId(Zend_Registry::get('config')->googlePlus->client_id);
$client->setDeveloperKey(Zend_Registry::get('config')->googlePlus->serverKey);
$client->setClientSecret(Zend_Registry::get('config')->googlePlus->secret);
$client->setRedirectUri('http://test.XXX.com/login/social/network/google');
$client->setScopes(array('https://www.googleapis.com/auth/userinfo.email','https://www.googleapis.com/auth/userinfo.profile'));
$client->setAccessType('offline');
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grand offline access
$client->getRefreshToken();
$plus = new Google_Service_Oauth2($client);
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
}
if ($client->getAccessToken())
{
$userinfo = $plus->userinfo;
die(print_r($userinfo->get()));
}
我不喜欢这种结构的方式,因为当用户在弹出窗口中填写凭据时,我已经通过了Google的身份验证。但我没有看到任何解决方法。我对所有建议持开放态度。这是我第一次使用这个API,我不得不说文档非常糟糕。
答案 0 :(得分:0)
范围需要用空格分隔。你添加了 。 '&安培;' 。
这意味着第二个范围是无效密钥&是一个特殊的角色。
如果您不知道,您可能会发现Oauthplayground在尝试各种请求时非常有用。 https://developers.google.com/oauthplayground/