2012-08-10 24 views
7

sto utilizzando gli esempi forniti nella libreria "google-api-php-client" (http://code.google.com/p/google-api-php-client/) per implementare l'accesso e l'autorizzazione dell'utente sul mio sito web con i servizi di google. Non ho apportato alcuna modifica agli esempi, tranne l'aggiunta del mio ID cliente, ecc.Come conservare le autorizzazioni di google api (OAuth 2)?

L'autorizzazione funziona correttamente: gli utenti possono accedere e posso recuperare le informazioni fornite. Tuttavia, quando si esce dalla pagina, viene richiamata l'intera procedura di autorizzazione; gli utenti non vengono ricordati e devono concedere nuovamente le autorizzazioni, il che è un po 'fastidioso e non tipico per i google-login come li conosco.

Ad esempio: su StackOverflow, ho effettuato l'accesso con il mio account Google. Ogni volta che rivisto questo sito, ho effettuato l'accesso in automatico, o (se disconnessi) devo solo accedere di nuovo - non devo confermare di nuovo i diritti generali. Tuttavia, l'utilizzo degli esempi sul mio sito obbliga l'utente a consentire l'accesso ogni volta che il sito viene visitato di nuovo.

Ho fatto degli errori quando uso gli esempi? Cosa devo fare per evitare la richiesta di permesso più e più volte?

Grazie in anticipo per qualsiasi tipo di aiuto!

risposta

0

La documentazione di Google Drive SDK include un'applicazione di esempio PHP completo che può essere utilizzato come riferimento per iniziare:

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

In sostanza, una volta che l'utente è connesso e si recupera token di accesso e di aggiornamento token, memorizzi tali credenziali in un database e riutilizzale invece di chiedere all'utente di autenticarsi ogni volta.

+0

Grazie, Claudio! Quel collegamento sembra interessante. Sembra, che io abbia bisogno di una sorta di "token for dummies" -guide. :-) Nel frattempo ho scoperto, che '$ client-> setAccessType (" online "); $ client-> setApprovalPrompt ("auto"); 'risolve una parte del problema. Ho provato a memorizzare il token lato client come cookie, ma senza successo ... – Elvis

+0

L'URL richiesto non è stato trovato su questo server. – yesitsme

1

Usa questo codice per la prima volta per recuperare access_code e salvarlo in database:

<?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 
    ?> 

volta ACCESS_TOKEN viene salvato nel database dei codici modifica:

<?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

Se volessi invece archiviare il token di aggiornamento, poiché desidero effettuare chiamate all'API in background quando l'utente non ha effettuato l'accesso, come cambia le cose. – Mikeys4u

1

che funziona bene per me. Sulla base della risposta del 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 
?> 
Problemi correlati