2012-08-10 6 views
7

Ich verwende die Beispiele in der "google-api-php-client" -Library (http://code.google.com/p/google-api-php-client/), um Benutzeranmeldung und Autorisierung zu implementieren auf meiner Website mit Google-Diensten. Ich habe keine Änderungen an den Beispielen vorgenommen, außer meine Kunden-ID, etc ..Wie speichert man Google API (OAuth 2) Berechtigungen?

Die Autorisierung selbst funktioniert gut: Benutzer können sich anmelden und ich kann die bereitgestellten Informationen abrufen. Beim Verlassen der Seite wird jedoch das gesamte Autorisierungsverfahren erneut aufgerufen. Benutzer werden nicht erinnert und müssen erneut Berechtigungen erteilen, was eine Art nervig und nicht typisch für Google-Logins ist, wie ich sie kenne.

Zum Beispiel: Auf Stackoverflow bin ich mit meinem Google-Konto eingeloggt. Immer wenn ich diese Seite erneut besuche, bin ich automatisch eingeloggt oder (wenn ich ausgeloggt bin) muss ich mich einfach neu einloggen - ich muss die allgemeinen Rechte nicht noch einmal bestätigen. Die Verwendung der Beispiele auf meiner Site erzwingt jedoch, dass der Benutzer Zugriff gewährt, sobald die Site erneut besucht wird.

Habe ich bei der Verwendung der Beispiele irgendwelche Fehler gemacht? Was muss ich tun, um die Erlaubnisanfrage immer wieder zu vermeiden?

Vielen Dank im Voraus für jede Art von Hilfe!

Antwort

0

Die Google Drive SDK-Dokumentation enthält eine vollständige PHP-Beispielanwendung, die Sie als Referenz verwenden können, um loszulegen:

https://developers.google.com/drive/examples/php

Grundsätzlich, wenn der Benutzer angemeldet ist und Sie Zugriffstoken und refresh abrufen token, speichern Sie diese Anmeldeinformationen in einer Datenbank und verwenden Sie sie erneut, anstatt den Benutzer zu bitten, sich jedes Mal zu authentifizieren.

+0

Danke, Claudio! Dieser Link sieht interessant aus. Es scheint, dass ich eine Art "Token für Dummies" -Guide brauche. :-) Mittlerweile habe ich herausgefunden, dass '$ client-> setAccessType (" online "); $ client-> setApprovalPrompt ("auto"); 'löst einen Teil des Problems. Ich habe versucht, die Token-Client-Seite als Cookie zu speichern, aber ohne Erfolg ... – Elvis

+0

Die angeforderte URL wurde auf diesem Server nicht gefunden. – yesitsme

1

Verwenden Sie diesen Code zum ersten Mal access_code abrufen und in der Datenbank speichern:

<?php 
    require 'google-api-php-client/src/Google_Client.php'; 
    require 'google-api-php-client/src/contrib/Google_DriveService.php'; 
    require 'google-api-php-client/src/contrib/Google_Oauth2Service.php'; 
    session_start(); 

    $client = new Google_Client(); 
    $client->setClientId(CLIENT_ID); 
    $client->setClientSecret(CLIENT_SECRET); 
    $client->setRedirectUri(REDIRECT_URI); 
    $client->setScopes(array(
     'https://www.googleapis.com/auth/drive', 
     'https://www.googleapis.com/auth/userinfo.email', 
     'https://www.googleapis.com/auth/userinfo.profile')); 

    $client->setUseObjects(true); 
    $service = new Google_DriveService($client); 
      $client->authenticate(); 
      $_SESSION['token'] = $client->getAccessToken(); 
      const ACCESS_TOKEN=$_SESSION['token']; 
       //code here to save in database 
    ?> 

Sobald access_token in Datenbankänderung Code gespeichert wird:

<?php 
     require 'google-api-php-client/src/Google_Client.php'; 
     require 'google-api-php-client/src/contrib/Google_DriveService.php'; 
     require 'google-api-php-client/src/contrib/Google_Oauth2Service.php'; 
    session_start(); 

     $client = new Google_Client(); 
     $client->setClientId(CLIENT_ID); 
     $client->setClientSecret(CLIENT_SECRET); 
     $client->setRedirectUri(REDIRECT_URI); 
     $client->setScopes(array(
      'https://www.googleapis.com/auth/drive', 
      'https://www.googleapis.com/auth/userinfo.email', 
      'https://www.googleapis.com/auth/userinfo.profile')); 

     $client->setUseObjects(true); 
     $service = new Google_DriveService($client); 

    //ACCESS_TOKEN is already saved in database, is being saved on first time login. 

     $_SESSION['access_token'] = ACCESS_TOKEN; 

     if (isset($_SESSION['access_token'])) { 
      $client->setAccessToken($_SESSION['access_token']); 
     } 

     if ($client->getAccessToken()) 
     { 
      $userinfo = $service->about->get(); 
      echo '<script>console.log('.json_encode($userinfo).');</script>'; 

      $userinfoService = new Google_OAuth2Service($client); 
      $user = $userinfoService->userinfo->get(); 
      echo '<script>console.log('.json_encode($user).');</script>'; 
     } 
    ?> 
+0

Wenn ich stattdessen das Aktualisierungstoken speichern möchte, da ich im Hintergrund Aufrufe an die API senden möchte, wenn der Benutzer nicht angemeldet ist, wie ändert sich dies. – Mikeys4u

1

Das ist für mich gut funktioniert. Basiert auf der Antwort von Kaushal:

<?php 
require_once 'globals.php'; 
require_once 'google-api-php-client/src/Google_Client.php'; 
require_once 'google-api-php-client/src/contrib/Google_DriveService.php'; 

$client = new Google_Client(); 

// Get your credentials from the APIs Console 
$client->setClientId('YOUR_ID'); 
$client->setClientSecret('YOUR_SECRET'); 
$client->setRedirectUri('REDIRECT_URI'); 
$client->setScopes(array('https://www.googleapis.com/auth/drive')); 


$service = new Google_DriveService($client); 
$client->setUseObjects(true); 

//if no token in the session 
if ($_SESSION['google_token'] == '') { 
    //get stored token from DB 
    $sToken = $oDb->getOne("SELECT `google_token` FROM `users` WHERE `u_id` = " . (int)$_SESSION['user_id']); 
    //if no stored token in DB 
    if ($sToken == '') { 
     //autentificate user 
     $client->authenticate(); 
     //get new token 
     $token = $client->getAccessToken(); 
     //set token in session 
     $_SESSION['google_token'] = $token; 
     // set token in DB 
     $oDb->Query("UPDATE `users` SET `google_token`='$token' WHERE `u_id` = " . (int)$_SESSION['user_id']); 
    } else { 
     $_SESSION['google_token'] = $sToken; 
    } 
} 
$client->setAccessToken($_SESSION['google_token']); 

//do what you wanna do with clients drive here 
?> 
Verwandte Themen