谷歌身份验证:OAuth2 不断返回“invalid_grant”
Posted
技术标签:
【中文标题】谷歌身份验证:OAuth2 不断返回“invalid_grant”【英文标题】:Authentication on google: OAuth2 keeps returning 'invalid_grant' 【发布时间】:2012-04-19 00:31:08 【问题描述】:我开始在我的新应用程序上配置谷歌日历。我几乎制作了谷歌开发人员(https://developers.google.com/google-apps/calendar/instantiate)显示的身份验证代码的精确副本,但我不断收到以下错误:
获取 OAuth2 访问令牌时出错,消息:'invalid_grant'
我目前正在使用 Fork-CMS (http://www.fork-cms.com),这是一个年轻的轻量级 CMS。我正确配置了 google-api-php-client 的 config.php 文件。 (client-id, client-secret, redirect-uri, development key,...) 并且重定向 uri 已在 google api 的控制台上正确设置。我的代码如下所示:
<?php
/**
* This is a widget with a calendar implementation.
*
* @package frontend
* @subpackage events
*
* @author Michiel Vlaminck <michielvlaminck@gmail.com>
*/
class FrontendEventsWidgetCalendar extends FrontendBaseWidget
private $events = array();
private $authUrl = array();
/**
* Execute the extra
*
* @return void
*/
public function execute()
// call parent
parent::execute();
// load template
$this->loadTemplate();
// get data
$this->getData();
// parse
$this->parse();
/**
* Get the data from Google Calendar
* This method is only executed if the template isn't cached
*
* @return void
*/
private function getData()
require_once PATH_LIBRARY . '/external/google-api-php-client/src/apiClient.php';
require_once PATH_LIBRARY . '/external/google-api-php-client/src/contrib/apiCalendarService.php';
$client = new apiClient();
$service = new apiCalendarService($client);
if (isset($_SESSION['oauth_access_token']))
$client->setAccessToken($_SESSION['oauth_access_token']);
else
$token = $client->authenticate();
$_SESSION['oauth_access_token'] = $token;
if ($client->getAccessToken())
$calId = FrontendEventsModel::getCalendarId((int) $this->data['id']);
$calId = $calId[0]['calendar_id'];
$events = $service->events->listEvents($calId);
$this->events = $events['items'];
$_SESSION['oauth_access_token'] = $client->getAccessToken();
else
$this->authUrl = $client->createAuthUrl();
/**
* Parse
*
* @return void
*/
private function parse()
$this->tpl->assign('events', $this->events);
$this->tpl->assign('authUrl', $this->authUrl);
?>
当我第一次打开这个小部件页面时,我会被定向到谷歌来验证应用程序。当我同意时,我会被重定向到我的应用程序,这就是我得到的结果:
apiAuthException » Main
Message Error fetching OAuth2 access token, message: 'invalid_grant'
File C:\wamp\www\Officevibes\library/external\google-api-php-client\src\auth\apiOAuth2.php
Line 105
Date Thu, 05 Apr 2012 08:34:47 +0000
URL http://localhost/calendar?code=4/YPUpFklKvhEeTcMm4moRth3x49oe
Referring URL (Unknown)
Request Method GET
User-agent Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (Khtml, like Gecko) Chrome/18.0.1025.142 Safari/535.19
【问题讨论】:
现在称为“重置您的客户端密码”而不是撤销。 在我的情况下,我使用的是以前从控制台 p12 密钥文件中删除的... 【参考方案1】:您应该重用您在第一次成功验证后获得的访问令牌。如果您之前的令牌尚未过期,您将收到 invalid_grant
错误。将其缓存在某个地方,以便您可以重复使用它。
【讨论】:
我认为这不再是真的。使用刷新令牌,我能够获得一个访问令牌,然后在第一个过期之前获得另一个。 (我认为这也可以在 OAuth 2.0 Playground 中看到 - developers.google.com/oauthplayground)。 其实.. 我可以使用 refresh_token 来生成更多的 access_token,即使当前的 access_token 还没有过期。它只会给我一个新的 access_token,而前一个仍然有效。所以...我不确定你说的是否准确。 很可能是这样。我根据当时的经验如实回答。这是互联网时代的古老答案。与此同时,情况可能发生了变化。【参考方案2】:转到您的 Google API 控制台 (https://code.google.com/apis/console/) 并在 已安装应用程序的客户端 ID 下撤销您的客户端密码。
请务必使用新的客户端密码更新您的代码
【讨论】:
【参考方案3】:由于我的服务器上的时间不正确,我遇到了类似的问题。确保您的系统时钟已同步。
【讨论】:
这也是我遇到的问题。我正在使用虚拟机来运行 API。唤醒后,时间尚未同步。 我尝试了很多解决方案。这是我没有尝试过的最后一个解决方案,因为我不明白。 “服务器上的时间不正确”是什么意思?如何检查系统时钟是否同步? 我也想知道@John 我在我的 Ubuntu Linux 服务器上做了以下同步时间,这对我有用(假设你没有安装网络时间协议(ntp)守护进程): sudo apt-get install ntp; sudo 服务 ntp 停止; sudo ntpdate -s time.nist.gov; sudo service ntp start【参考方案4】:-
访问 security.google.com
撤销访问权限
再次访问认证网址
您现在将获得一个新的刷新令牌
【讨论】:
【参考方案5】:如果您错误地尝试验证您的 ID 令牌,而不是 访问令牌,您也会收到此错误消息。
所以不要像我一样 - 确保将正确的令牌传递到代码中!
【讨论】:
【参考方案6】:我遇到了类似的问题。 “invalid_grant”的问题在于它基本上是与令牌相关的任何错误的占位符。我发现this 文章真的很有帮助。
【讨论】:
以上是关于谷歌身份验证:OAuth2 不断返回“invalid_grant”的主要内容,如果未能解决你的问题,请参考以下文章
谷歌 OAuth2 API。检查用户是不是有两因素身份验证(不是 GSuite)