9

Ich erstelle eine Anwendung, mit der der Administrator den Zugriff auf ihr Analysekonto für die Offlineverwendung authentifizieren kann, und speichert das Aktualisierungstoken in der Datenbank.Wie kann ich ein aktualisiertes Zugriffstoken mithilfe gespeicherter Aktualisierungstoken erhalten?

Nun, wenn ich versuche, die API auf dem Frontend zu verwenden, gibt es die folgenden Fehler:

"Access Token Expired. There wan a general error : The OAuth 2.0 access token has expired, and a refresh token is not available. Refresh tokens are not returned for responses that were auto-approved." 

Hier ist mein Code, der diesen Fehler erzeugt so weit:

require_once "lib/google/Google_Client.php"; 
require_once "lib/google/contrib/Google_AnalyticsService.php"; 

$_analytics = new analytics(); 
$_googleClient = new Google_Client(); 
$_googleClient->setClientId($_analytics->gaClientId); 
$_googleClient->setClientSecret($_analytics->gaClientSecret); 
$_googleClient->setRedirectUri($_analytics->gaRedirectUri); 
$_googleClient->setScopes($_analytics->gaScope); 
$_googleClient->setAccessType($_analytics->gaAccessType); 

// Returns last access token from the database (this works) 
$_tokenArray['access_token'] = $_analytics->dbAccessToken($_agencyId); 
$_googleClient->setAccessToken(json_encode($_tokenArray)); 

if($_googleClient->isAccessTokenExpired()) { 
    // Don't think this is required for Analytics API V3 
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId)); 
    echo 'Access Token Expired'; // Debug 
} 

if (!$_googleClient->getAccessToken()) { 
    echo '<h2>Error - Admin has not setup analytics correct yet</h2>'; 
} 

Ich bin nach eine Funktion, um etwas wie setRefreshToken auszuführen - den Wert von der Datenbank eingeben, von dem Admin, der sie vorher online authentifiziert hat.

Antwort

7

Sie könnten Folgendes versuchen: Sie müssten den Code hinzufügen, um das neue Token in Ihrer Datenbank zu speichern.

if($_googleClient->isAccessTokenExpired()) { 
    // Don't think this is required for Analytics API V3 
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId)); 
    echo 'Access Token Expired'; // Debug 

    $_googleClient->authenticate(); 
    $NewAccessToken = json_decode($_googleClient->getAccessToken()); 
    $_googleClient->refreshToken($NewAccessToken->refresh_token); 
} 
+1

das ist es fixiert ist, und ich habe versucht, das Token mit dem Zugang t zu aktualisieren oken, anstatt das Refresh-Token als Parameter zu verwenden. #Fehler - Danke! – mattpark22

+1

Kennen beide von Ihnen, wie ich ein Zugriffstoken zum Ablaufen zwingen kann, um mithilfe der Funktion zum Aktualisieren von Token ein neues Zugriffstoken zu erhalten? @mpark – Anagio

+1

@Anagio Sie sollten '$ _googleClient-> refreshToken ($ NewAccessToken-> refresh_token);' ausführen, um ein neues Token zu erzwingen. Dann vergleichen Sie einfach das alte mit dem neuen Token, um zu sehen, ob es sich geändert hat. –

0

Verwenden Sie einen try/catch und verwenden Sie den Fang für die Umleitung/Aktualisierung des Zugriffstoken. Unten ist die Lösung, die ich für ähnliches Problem verwendet:

$plus = new Google_Service_Plus($client); 
try { 
$me = $plus->people->get('me'); 
} catch(Exception $e){ 
     if(!(strpos($_SERVER["REQUEST_URI"],'logout'))){ 
     if (isset($authUrl)){ 
       $redirect = $authUrl; 
     } 
     else{ 
        $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] .'?logout'; 
     } 
     header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); 
     exit; 
} 

Sie die Anweisung unter Versuch mit der Linie wirft die Ausnahme ersetzen können, denke ich, dass

$_googleClient->setClientId($_analytics->gaClientId); 

sein würde, oder Sie können auch erfrischend versuchen das Token als pro-Lösung hier gegeben:

https://stackoverflow.com/a/22096740/1675384