【发布时间】:2015-10-12 22:07:58
【问题描述】:
这是我的问题。我在带有自定义图像的页面上有一个 Google Plus 链接。网址是
https://accounts.google.com/o/oauth2/auth?client_id=' 。 Zend_Registry::get('config')->googlePlus->client_id 。 '&redirect_uri=' . urlencode($strRedirectUrl) 。 '&access_type=offline&response_type=code&scope=' 。 urlencode('https://www.googleapis.com/auth/plus.login') 。 '&' 。 urlencode('https://www.googleapis.com/auth/plus.me')
客户端 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,我不得不说文档真的很烂。
【问题讨论】:
-
如果您查看错误页面上的“请求详细信息”下拉菜单,
redirect_uri值是否与配置了 redirect_uris 的应用程序之一完全匹配?一个字符一个字符,包括协议、端口、后面的斜线等。 -
我没有收到包含请求详细信息的 Google 错误页面。到这个周期的那个时候,Zend 已经拦截了调用并抛出了 Google 异常作为它自己的异常——没有请求详细信息。
-
但是代码中的内容正是,字符对字符,开发控制台中的内容,以回答您的问题。除非有什么东西被重写了,我不知道怎么看,因为那时 Zend 已经在里面了。
-
有一个很大帮助的事情是确切地知道我需要用户单击哪个链接来弹出身份验证窗口。有人吗?
标签: php google-api google-plus google-oauth google-api-php-client