2016-05-23 14 views
0

ZielKann nicht aktualisieren Token in Google API

Ich muss die Daten von Google Analytics holen, nachdem meine Benutzer abgemeldet haben. Im Grunde gehen sie auf meine Seite, autorisieren meine App für den Zugriff auf ihre GA-Daten und um Mitternacht hole ich die Daten und verarbeite sie in meinem Dienst.

Mein Stromfluss

Nach der Lektüre hier viele keine Beiträge und Fragen ist, was ich kommen:
Die Front sieht Endteil wie etwas dieser:

<script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script> 
<script> 
    function start() { 
     gapi.load('auth2', function() { 
      auth2 = gapi.auth2.init({ 
       client_id: '{{CLIENT_ID}}.apps.googleusercontent.com', 
       scope: 'https://www.googleapis.com/auth/analytics', 
       access_type: 'offline' 
      }); 
     }); 
    } 
    $('#signinButton').click(function() { 
     auth2.grantOfflineAccess({ 
      'redirect_uri': 'postmessage' 
     }).then(signInCallback); 
    }); 

    function signInCallback(authResult) { 
     window.console.log('signInCallback: This code must be exchanged by the server, it grants access to request a refresh token: ',authResult, arguments); 
     if (authResult['code']) { 
      // Hide the sign-in button now that the user is authorized, for example: 
      $('#signinButton').attr('style', 'display: none').after('<p>The auth code is: ' + authResult['code'] + '</p>'); 

      $.get('http://mysite.dev/oauth_callback.php?code=' + authResult['code']) 
       .fail(function(err){console.error(err)}) 
       .done(function(data) { 
        var message; 
        if (typeof data.error == 'undefined') { 
         message = '<div style="border: green solid 1px;">Finished the request and got ' + data + '</div>'; 
        } else { 
         message = '<div style="border: red solid 1px;">' + data.message + '</div>'; 
        } 
        $('#signinButton').after(message); 
       }); 
     } else { 
      // There was an error. 
     } 
    } 
</script> 

meine oauth_callback.php prüft die Antwort von Google und speichert es in der Datenbank (bitte ignorieren Sie das $ .get vs $ Post-Bit).

Aus meinen Tests sehe ich, dass der Auth_code zusammen mit dem Refresh_Token und anderen Teilen ordnungsgemäß in meiner Datenbank gespeichert sind.

Nun, ich manuell meinen Mitternacht Skript auslösen, die ein wenig wie folgt aussieht:

public function get_client() { 
    // Create and configure a new client object. 
    $client   = new \Google_Client(); 
    $path_to_config = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my-client-secret.apps.googleusercontent.com.json'; 
    $scopes = array(
     'https://www.googleapis.com/auth/analytics' 
    ); 

    $client->setAuthConfigFile($path_to_config); 
    $client->setApplicationName("My app"); 
    $client->setAccessType('offline'); 
    return $client; 
} 
public function fetch_visits() { 
    foreach ($this->_accounts as $account_id => $auth_json_string) { 

     $client = $this->get_client(); 
     $ga_code_array = json_decode($auth_json_string, true); 

     $ga_code_string = $auth_json_string; 

     $client->setAccessToken($auth_json_string); 
     var_dump($client); 
     if ($client->isAccessTokenExpired()) { 
      $client->setAccessType('offline'); 
      var_dump('Not authed because the access token expired. Requesting another one'); 
      $client->refreshToken($auth_json_string);; 
      $is_authed_now = $client->isAccessTokenExpired(); 
      var_dump($is_authed_now); 
     } 
     die('sadasdsdsa'); 
    } 
} 

Der Fehler

Mit diesem Code Im die berüchtigten bekommen: Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant"" Fehler, die ich verfolgen an die OAuth-Bibliothek und im Grunde Google einen HTTP-Code 400 (anstelle von 200) zurück, die mir sagt, dass die $ auth_json_string ist nicht korrekt, aber das ist die gleiche Zeichenfolge, die Google gab mir, nachdem der Benutzer meine App autorisiert, so dass ich nicht wirklich Ich weiß, wo das Problem liegt.

Bitte beachten Sie, dass dies eine Server-zu-Server-App ist, der Benutzer wird nicht eingeloggt, wenn mein Dienst läuft, deshalb speichere ich das Auth-Json-Objekt.

Können Sie sehen, was ich falsch mache?

+0

einen Blick auf meine Antwort hier Take - http://stackoverflow.com/a/35638759/468862 - lassen Sie mich wissen, ob das hilft. Aber wahrscheinlich müssen Sie das Refresh-Token anstelle des Zugriffstokens verwenden, da das Zugriffstoken nur für eine Stunde reicht - daher der Fehler. Auch ich muss einen Link zu den Dokumenten finden, aber ich bin ziemlich sicher, dass Sie die JS-Bibliothek nicht verwenden können, um Offline-Zugriff zu erhalten. Schau dir nochmal meine Antwort an, die es serverseitig macht. –

Antwort

0

Für PHP habe ich die folgende

$ client-> setAccessType ("refresh_token");

Und das löste mein Problem. Ich verwende Google Mail, sollte aber für die anderen Google-Dienste arbeiten. Denken Sie daran, das refresh_token beim Erstellen der ersten access_token-Anfrage zu speichern, da sonst weitere Probleme auftreten.

So habe ich jetzt eine Funktion getClient genannt()

function getClient(){ 
    $googleUser = $this->getUserDetails(); 
    $client = new Google_Client(); 
    $client->setAuthConfigFile('client_secret.json'); 

    $client->setApplicationName("YOUR_APP_NAME"); 

    $data = $googleUser->attributes; 



    $client->setAccessToken(json_encode($data)); 

    if($client->isAccessTokenExpired()){ 


     $client->addScope(Google_Service_Gmail::MAIL_GOOGLE_COM); 

     $client->setAccessType("refresh_token"); 

     $client->refreshToken($data['refresh_token']); 



     $access_token = $client->getAccessToken(); 


     $data1 = json_decode($access_token); 


     $googleUser->access_token = $data1->access_token; 
     $googleUser->token_type = $data1->token_type; 
     $googleUser->expires_in = $data1->expires_in; 
     $googleUser->created_date = date('Y-m-d h:i:s',$data1->created); 
     $googleUser->created = $data1->created; 

     $googleUser->save(); 


     $client->setAccessToken($access_token); 

    } 

    return $client; 
} 
Verwandte Themen