2012-04-11 11 views
5

He leído la documentación, ejemplos y tutoriales sobre cómo usar la API de Google, tengo una mini aplicación que ya muestra tus actividades e información más recientes, pero usa sesiones para almacenar el token.Google+ OAuth API almacenar y recuperar tokens después del primer inicio de sesión y autorización

Mi pregunta es, ¿cómo puedo almacenar y recuperar el token de la base de datos para que cuando un usuario (que ya se ha registrado) haga clic en "iniciar sesión", pueda usar la API de inmediato sin una autorización repetida? Tenga en cuenta que utilicé el ejemplo como punto de partida para mi mini aplicación.

He aquí un fragmento de código:

$client = new apiClient(); 
$client->setApplicationName(APP_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setRedirectUri(REDIRECT_URL); 
$client->setDeveloperKey(DEV_KEY); 

$plus = new apiPlusService($client); 
$google_userinfo = new apiOauth2Service($client); 

$message = ""; 

// In a real application this would be stored in a database, and not in the session! 
if (isset($_SESSION['token'])) 
    $client->setAccessToken($_SESSION['token']); 

$_SESSION['token'] = $client->getAccessToken(); 

if (isset($_GET['code'])) { 
    $client->authenticate(); 
    // In a real application this would be stored in a database, and not in the session! 
    $_SESSION['token'] = $client->getAccessToken(); 
    header('Location: http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']); 
} 
... 
//Somewhere here, I added a function that ties $_SESSION['token'] to the user's info. 
... 
<form action="" method="post" id="form1" name="form1"> 
    <fieldset> 
     <div id="main-url-section" style="width: 50%;margin: 0px auto;text-align: center;"> 
     <?php 
      $authUrl = $client->createAuthUrl(); 
      print "<p><a class='login' href='$authUrl'>Log me in!</a></p>"; 
     ?>         
     </div> 
    </fieldset> 
</form> 

Muchas gracias por la ayuda!

Saludos,

John

Respuesta

9

Si desea Google para saltar la línea de autorización para las personas que ya han autorizado la aplicación, agregue este código en tu bloque de configuración en la parte superior:

$client->setAccessType("online"); 
$client-> setApprovalPrompt("auto"); 

Hay una pega con esta solución: no recibirás un token de actualización cuando completes tu baile de OAuth. Esto significa que sus usuarios serán redirigidos al servicio de autenticación de Google cada vez que su token de acceso caduque para poder obtener uno nuevo. Esto sucederá aproximadamente cada hora.

Información de Antecedentes

Por defecto la biblioteca cliente PHP está configurado para proporcionar offline access. Puedes ver esto en el source code. Cuando este modo está habilitado, el flujo OAuth producirá un refresh token que se puede usar para solicitar nuevos tokens de acceso según sea necesario. Es posible que ni siquiera notes que esto sucede. La biblioteca de cliente PHP se encarga de la mayor parte de esto por usted.

Este token de actualización tiene un costo, sin embargo. Usted es responsable de almacenarlo. Si lo pierde, su usuario debe volver a autorizar su solicitud para que se le otorgue otra. La forma de almacenarlo depende mucho de los detalles de su implementación. Los datos de sesión son una forma razonable de hacerlo si puede hacerlo lo suficientemente duradero.

+0

Gracias por esta respuesta! Esto es útil y puedo usarlo como solución temporal. :) Ya lo he comprobado. ¿Pero conoces o tienes un enlace a cualquier publicación sobre cómo almacenar los tokens que obtengo en $ client-> getAccessToken()? y usarlos cuando el usuario inicia sesión? – user1239714

+0

@ user1239714: No conozco un lugar específico para vincularlo aquí. Depende completamente de cómo persista el resto de los datos en su aplicación. Por ejemplo, si está escribiendo una aplicación LAMP típica, puede tener sentido almacenar el token de actualización en MySql para recuperarlo más tarde. – mimming

+1

@JennyMurphy "Puedes ver esto en el código fuente". El enlace está roto. ¿Podría proporcionar otra muestra? – knightrider

0

Esta es una pregunta anterior, pero me parece que la respuesta no fue completa.

La respuesta aceptada funciona de forma que el usuario pasa por el servidor de autenticación de Google, pero no ve la pantalla de autenticación. La pregunta era sobre el almacenamiento del token y usarlo nuevamente sin enviar al usuario al servidor de Google.

Así que si eso es lo que quiere hacer (y también le permitirá acceder a los datos de usuario incluso cuando no están usando su aplicación), todo lo que necesita hacer es solicitar un token de acceso que incluye un token de actualización .

Lo hace utilizando el tipo de acceso sin conexión (que por cierto ya no es el predeterminado) - por ejemplo, en php: $client->setAccessType("offline");.

Solo tenga en cuenta que el token de acceso que reciba incluirá el token de actualización solo en la primera autorización inicial del usuario, de modo que eso es lo que necesita almacenar.

Luego puede usar ese token de acceso con el cliente, incluso cuando haya caducado, y el cliente se encargará de actualizarlo y obtener uno nuevo.

Espero que ayude, Amos

Cuestiones relacionadas