2012-04-05 172 views
19

我开始在我的新应用程序上配置谷歌日历。我差点让在谷歌开发者(https://developers.google.com/google-apps/calendar/instantiate)中显示的验证码的精确副本,但我不断收到以下错误:谷歌验证:OAuth2不断返回'invalid_grant'

错误获取的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,...),并且在google api的控制台上正确设置了redirect uri。我的代码如下:

<?php 

/** 
* This is a widget with a calendar implementation. 
* 
* @package  frontend 
* @subpackage events 
* 
* @author  Michiel Vlaminck <[email protected]> 
*/ 
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 
+1

它现在称为“重置您的客户端密钥”而不是撤销。 – jenlampton 2013-03-30 01:40:36

+0

在我的情况下,我曾使用以前从控制台p12密钥文件删除... – yergo 2015-06-09 08:56:14

回答

22

你应该重用访问令牌你先去验证成功后。如果您之前的令牌尚未过期,您将收到invalid_grant错误。将其缓存在某处,以便可以重新使用它。

+7

我认为这不再是真实的。使用刷新令牌,我可以获得访问令牌,然后在第一个过期之前获得另一个令牌。 (我认为这可以在OAuth 2.0 Playground中看到 - https://developers.google.com/oauthplayground/)。 – user637563 2013-11-17 17:39:30

+0

其实..即使当前没有过期,我仍然可以使用refresh_token生成更多的access_tokens。它只会给我一个新的access_token,而前一个仍然有效。所以...我不知道你说的是准确的。 – omarojo 2015-12-04 00:10:13

+0

这很可能。我根据当时的经验真实地回答。这是互联网时代的一个古老答案。事情可能在此期间发生变化。 – janmoesen 2016-01-21 10:19:34

8

转到您的Google API控制台(https://code.google.com/apis/console/)并撤消您的客户端密钥已安装应用程序的客户端ID

此外,请务必使用新的客户端秘密

9

我有我的服务器是不正确造成的时间类似的问题更新您的代码。确保你的系统时钟是同步的。

+0

这就是它!!!!! – kizzx2 2014-10-08 17:49:00

+0

这也是我遇到的问题。我正在使用虚拟机来运行API。直接在唤醒后时间还没有被同步。 – Rias 2015-03-31 16:53:27

+1

我已经尝试了很多解决方案。这是我没有尝试过的最后一个解决方案,因为我不明白。 “服务器上的时间不正确”是什么意思?如何检查系统时钟是否同步? – John 2016-04-22 07:57:51

3
  1. 转到security.google.com
  2. 撤销访问
  3. 访问认证URL再次
  4. 你现在得到一个新的refreshtoken
1

您还会收到此错误,如果您错误地尝试验证您的ID令牌,而不是您的访问令牌

所以不要像我一样 - 确保将正确的标记传递给您的代码!