Pregunta Google+ OAuth API almacena y recupera los tokens después del primer inicio de sesión y la autorización


He leído la documentación, los ejemplos y los tutoriales sobre cómo usar la API de Google, ya tengo una mini aplicación que muestra sus últimas actividades e información, pero uso sesiones para almacenar el token.

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.

Aquí hay 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


5
2018-04-11 07:19


origen


Respuestas:


Si desea que Google omita la solicitud de autorización para las personas que ya han autorizado su aplicación, agregue este código en su bloque de configuración en la parte superior:

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

Hay un inconveniente 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 caduque su token de acceso para obtener uno nuevo. Esto sucederá aproximadamente cada hora.

Información de fondo

Por defecto, la biblioteca del cliente PHP está configurada para proporcionar acceso fuera de línea. Puedes ver esto en el código fuente. Cuando este modo está habilitado, el flujo de OAuth producirá un token de actualización 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.

Sin embargo, este token de actualización tiene un costo. 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.


9
2018-04-12 01:41



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

La respuesta aceptada funciona de manera 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.

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

Para ello, usa 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 esté vencido, y el cliente se encargará de actualizarlo y obtener uno nuevo.

Espero que ayude, Amos


0
2017-09-26 16:48