webentwicklung-frage-antwort-db.com.de

Authentifizierung bei Google: OAuth2 gibt 'invalid_grant' immer wieder zurück

Ich habe begonnen, Google Kalender in meiner neuen Anwendung zu konfigurieren. Ich hätte fast eine genaue Kopie des Authentifizierungscodes erstellt, der bei Google-Entwicklern angezeigt wird ( https://developers.google.com/google-apps/calendar/instantiate ). Ich erhalte jedoch die folgende Fehlermeldung:

Fehler beim Abrufen des OAuth2-Zugriffstokens, Nachricht: 'invalid_grant' 

Derzeit verwende ich Fork-CMS ( http://www.fork-cms.com ), ein junges leichtes CMS. Ich habe die config.php-Datei des google-api-php-clients korrekt konfiguriert. (client-id, client-secret, redirect-uri, entwicklungsschlüssel, ...) und der redirect-uri ist auf der Konsole von google api richtig eingestellt. Mein Code sieht wie folgt aus:

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

?>

Wenn ich diese Widget-Seite zum ersten Mal öffne, werde ich dazu aufgefordert, die Anwendung zu authentifizieren. Wenn ich damit einverstanden bin, werde ich zu meiner Bewerbung weitergeleitet. An diesem Punkt bekomme ich:

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

Sie sollten das Zugriffstoken, das Sie nach der ersten erfolgreichen Authentifizierung erhalten, erneut verwenden. Sie erhalten eine invalid_grant-Fehlermeldung, wenn Ihr vorheriges Token noch nicht abgelaufen ist. Zwischenspeichern Sie ihn irgendwo, damit Sie ihn wiederverwenden können.

22
janmoesen

Ich hatte ein ähnliches Problem, weil die Uhrzeit auf meinem Server falsch war. Stellen Sie sicher, dass Ihre Systemuhr synchronisiert ist. 

9
Sio

Wechseln Sie zu Ihrer Google API-Konsole ( https://code.google.com/apis/console/ ) und widerrufen Sie Ihr Client-Geheimnis unter Client ID für installierte Anwendungen.

Stellen Sie sicher, dass Sie auch Ihren Code mit dem neuen Client Secret aktualisieren

8
Zach M.
  1. Gehen Sie zu security.google.com
  2. Zugriffsrechte entziehen
  3. besuchen Sie die Authentifizierungs-URL erneut
  4. sie erhalten jetzt eine neue Wiederholung 
3

Sie erhalten diese Fehlermeldung auch, wenn Sie versehentlich versuchen, Ihr ID-Token und nicht Ihr Access-Token zu authentifizieren. 

Seien Sie also nicht wie ich - Stellen Sie sicher, dass Sie den richtigen Token in Ihren Code eingeben!

1
Matt

Ich hatte ein ähnliches Problem. Das Problem mit "invalid_grant" besteht darin, dass es im Wesentlichen ein Platzhalter für alle Fehler ist, die in Bezug auf das Token auftreten. Ich fand diesen Artikel sehr hilfreich.

0
zomnombom