2012-08-10 21 views
7

estoy usando los ejemplos proporcionados en la "google-api-php-client" -Library (http://code.google.com/p/google-api-php-client/) para implementar el inicio de sesión y la autorización del usuario en mi sitio web con los servicios de google. No realicé ningún cambio en los ejemplos, excepto agregando mi Client-ID, etc.Cómo almacenar los permisos de Google api (OAuth 2)?

La autorización en sí misma funciona bien: los usuarios pueden iniciar sesión y puedo obtener la información proporcionada. Sin embargo, al salir de la página, se vuelve a llamar a todo el procedimiento de autorización; los usuarios no son recordados y necesitan otorgar permisos nuevamente, lo cual es algo molesto y no típico de los inicios de sesión de google tal como los conozco.

Por ejemplo: en stackoverflow, estoy conectado con mi cuenta de google. Cada vez que vuelvo a visitar este sitio, estoy conectado automáticamente, o (si estoy desconectado) solo tengo que volver a iniciar sesión - no tengo que confirmar los derechos generales nuevamente. Sin embargo, el uso de ejemplos en mi sitio obliga al usuario a permitir el acceso cada vez que se visita el sitio.

¿Cometí algún error al usar los ejemplos? ¿Qué debo hacer para evitar la solicitud de permiso una y otra vez?

¡Gracias de antemano por cualquier tipo de ayuda!

Respuesta

0

La documentación de Google Drive SDK incluye una aplicación de ejemplo de PHP completo que se puede utilizar como referencia para empezar:

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

Básicamente, una vez que el usuario ha iniciado sesión y recuperar token de acceso y actualización token, almacena esas credenciales en una base de datos y las vuelve a usar en lugar de pedirle al usuario que se autentique cada vez.

+0

Gracias, Claudio! Ese enlace parece interesante. Parece que necesito algún tipo de guía "tokens for dummies". :-) Mientras tanto, descubrí que '$ client-> setAccessType (" en línea "); $ client-> setApprovalPrompt ("auto"); 'resuelve una parte del problema. Intenté almacenar el token del lado del cliente como una cookie, pero sin éxito ... – Elvis

+0

La URL solicitada no se encontró en este servidor. – yesitsme

1

Use este código para primera vez para recuperar access_code y guardarla en la base de datos:

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

Una vez señal_acceso se guarda en la base de datos de código de cambio a:

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

Si, en cambio, quería almacenar el token de actualización, ya que quiero hacer llamadas a la API en segundo plano cuando el usuario no está conectado, ¿cómo cambia eso? – Mikeys4u

1

que funciona bien para mí. Basado en la respuesta 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 
?> 
Cuestiones relacionadas