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
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.
J'avais un problème similaire causé par l'heure incorrecte sur mon serveur. Assurez-vous que votre horloge système est synchronisée.
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
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!
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.