2012-04-05 14 views
19

Ho iniziato a configurare il calendario di Google sulla mia nuova applicazione. Ho quasi fatto una copia esatta del codice di autenticazione visualizzata al sviluppatori di Google (https://developers.google.com/google-apps/calendar/instantiate), ma continuo a ricevere il seguente errore:Autenticazione su google: OAuth2 continua a restituire 'invalid_grant'

Errore di recupero token di accesso OAuth2, un messaggio: 'invalid_grant'

Attualmente sto usando Fork-CMS (http://www.fork-cms.com), un giovane CMS lightweigth. Ho correttamente configurato il file config.php di google-api-php-client. (client-id, client-secret, redirect-uri, chiave di sviluppo, ...) e il reindirizzamento uri è impostato correttamente sulla console di google api. Il mio codice è il seguente:

<?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); 
    } 
} 

?> 

Quando apro questo widget pagine per la prima volta, ho diretto a Google per autenticare l'applicazione. Quando sono d'accordo, vengo reindirizzato alla mia richiesta e questo è il punto in cui sto ottenendo:

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

Ora viene chiamato "Ripristina il segreto del client" invece di revocare. – jenlampton

+0

Nel mio caso stavo usando precedentemente cancellato dal file chiave della console p12 ... – yergo

risposta

22

Si dovrebbe riutilizzare il token di accesso si ottiene dopo il primo successo di autenticazione. Otterrai un errore invalid_grant se il tuo token precedente non è ancora scaduto. Cache da qualche parte in modo da poterlo riutilizzare.

+7

Penso che questo non sia più vero. Usando un token di aggiornamento, sono stato in grado di ottenere un token di accesso e poi un altro prima che il primo fosse scaduto. (Penso che questo possa essere visto anche in OAuth 2.0 Playground - https://developers.google.com/oauthplayground/). – user637563

+0

In realtà .. In grado di utilizzare il refresh_token per generare più access_tokens anche se quello corrente non è scaduto. Mi darà solo un nuovo access_token e il precedente è ancora valido. Quindi ... Non sono sicuro che quello che stai dicendo sia accurato. – omarojo

+0

Questo potrebbe benissimo essere. Ho risposto sinceramente in base alla mia esperienza allora. Questa è una risposta antica nel tempo di Internet. Le cose potrebbero essere cambiate nel frattempo. – janmoesen

8

Vai alla tua Console dell'API di Google (https://code.google.com/apis/console/) e revoca il segreto del cliente sotto ID client per le applicazioni installate.

Assicurarsi di aggiornare anche il codice con il nuovo client Segreto

9

stavo avendo un problema simile provocate dal tempo sul mio server di essere corretto. Assicurati che il tuo orologio di sistema sia sincronizzato.

+0

Questo è !!!!! – kizzx2

+0

Era il problema che avevo anch'io. Sto usando una macchina virtuale per eseguire l'API. direttamente dopo il risveglio, il tempo non è ancora sincronizzato. – Rias

+1

Ho provato molte soluzioni.Questa è l'ultima soluzione che non ho provato perché non capisco. Cosa intendi per "tempo in cui il server non è corretto"? Come verificare se l'orologio di sistema è sincronizzato? – John

3
  1. Vai security.google.com
  2. revocare l'accesso
  3. visita l'URL di autenticazione di nuovo
  4. si avrà ora una nuova refreshtoken
1

Riceverai inoltre questo errore se per errore prova ad autenticare il token ID anziché il token di accesso .

Quindi non essere come me - Assicurati di passare il token corretto nel tuo codice!

Problemi correlati