2012-04-05 166 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令牌,而不是您的訪問令牌

所以不要像我一樣 - 確保將正確的標記傳遞給您的代碼!