web-dev-qa-db-fra.com

Authentification sur Google: OAuth2 renvoie constamment 'invalid_grant'

J'ai commencé à configurer Google Agenda sur ma nouvelle application. J'ai presque fait une copie exacte du code d'authentification affiché chez les développeurs de Google ( https://developers.google.com/google-apps/calendar/instantiate ), mais je continue à avoir l'erreur suivante:

Erreur lors de l'extraction du jeton d'accès OAuth2, message: 'invalid_grant' 

J'utilise actuellement Fork-CMS ( http://www.fork-cms.com ), un jeune CMS lightweigth. J'ai correctement configuré le fichier config.php du client google-api-php. (client-id, client-secret, redirect-uri, clé de développement, ...) et l'URI de redirection est correctement défini sur la console de Google Api. Mon code se présente comme suit:

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

?>

Lorsque j'ouvre cette page de widget pour la première fois, je suis dirigé vers Google pour authentifier l'application. Quand je suis d'accord, je suis redirigé vers ma candidature et c'est là que je parviens à obtenir:

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
19
Michiel

Vous devez réutiliser le jeton d'accès obtenu après la première authentification réussie. Vous obtiendrez une erreur invalid_grant si votre précédent jeton n'a pas encore expiré. Cachez-le quelque part pour pouvoir le réutiliser.

22
janmoesen

J'avais un problème similaire causé par l'heure incorrecte sur mon serveur. Assurez-vous que votre horloge système est synchronisée. 

9
Sio

Accédez à votre console Google API ( https://code.google.com/apis/console/ ) et révoquez votre secret client sous ID client pour les applications installées.

Veillez également à mettre à jour votre code avec le nouveau secret client

8
Zach M.
  1. Accédez à security.google.com.
  2. Accès révoqué
  3. visitez à nouveau l'URL d'authentification
  4. vous obtiendrez maintenant un nouveau rafraîchissement 
3
Sebastiaan Hilbers

Vous recevrez également cette erreur si vous tentez par erreur d'authentifier votre jeton ID, plutôt que votre jeton Access

Alors ne soyez pas comme moi - Assurez-vous de bien insérer le bon jeton dans votre code!

1
Matt

J'ai eu un problème similaire. Le problème avec "invalid_grant" est qu’il s’agit essentiellement d’un espace réservé pour toute erreur qui survient par rapport au jeton. J'ai trouvé this article très utile.

0
zomnombom