我开始在新应用中配置Google日历。我几乎完成了谷歌开发人员(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文件。 (客户端ID,客户端密码,redirect-uri,开发密钥,...)和重定向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
答案 0 :(得分:22)
您应该重用第一次成功验证后获得的访问令牌。如果您之前的令牌尚未过期,您将收到invalid_grant
错误。将其缓存在某处,以便您可以重复使用它。
答案 1 :(得分:9)
由于服务器上的时间不正确,我遇到了类似的问题。确保系统时钟已同步。
答案 2 :(得分:8)
转到您的Google API控制台(https://code.google.com/apis/console/)并撤消已安装应用程序的客户端ID 下的客户端密钥。
请务必使用新的客户端密钥更新您的代码
答案 3 :(得分:3)
答案 4 :(得分:1)
如果您错误地尝试验证 ID令牌,而不是访问令牌,您也会收到此错误。
所以不要像我一样 - 确保将正确的令牌传递给您的代码!
答案 5 :(得分:0)
我有一个类似的问题。 “ invalid_grant”的问题在于,它基本上是占位符的占位符,用于与令牌相关的任何错误。我发现this的文章确实很有帮助。