es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Seleccionar previamente la cuenta para la pantalla de consentimiento de Google OAuth2 con el fin de evitar la selección redundante de cuentas.

En mi aplicación web quiero implementar el siguiente flujo:

  1. El usuario hace clic en el botón “Iniciar sesión con Google”.
  2. El usuario selecciona una cuenta en la pantalla redirigida.
  3. Recibo un JWT con el ID de cuenta y la dirección de correo electrónico.
  4. Establezco el ID de cuenta como una pista de inicio de sesión y configuro la opción de “consentimiento” solamente.
  5. Creo la URL de autenticación y redirijo nuevamente a Google para el consentimiento.
  6. En esta siguiente pantalla de consentimiento, el usuario solo debería tener que aprobar el consentimiento y no seleccionar su cuenta por segunda vez.
  7. Proceso la respuesta de consentimiento.

De acuerdo con la documentación, implementé la respuesta del “botón de inicio de sesión con Google” de la siguiente manera en PHP:

$payload = $client->verifyIdToken($id_token); //Procesar el JWT
if ($payload) {
    $userid = $payload['sub']; //Obtener el ID único de Google del usuario
    $client->setLoginHint($userid); //Establecer el ID de usuario como pista para el próximo consentimiento
    $client->setPrompt('consent'); //Establecer la opción de aprobación únicamente para el consentimiento
    $client->setScopes(...);
    $client->setAccessType('offline');
    $client->setRedirectUri(...);
}

//Crear URL de autenticación para el consentimiento
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Más información: https://developers.google.com/identity/protocols/oauth2/web-server#creatingclient

Comportamiento observado:
1. El usuario hace clic en el botón “Iniciar sesión con Google”.
2. El usuario selecciona una cuenta y se proporciona el JWT.
3. El usuario es redirigido a la pantalla de consentimiento.
4. El usuario tiene que seleccionar la cuenta nuevamente <– Comportamiento no deseado.
5. El usuario acepta el consentimiento.
6. El usuario es redirigido a la devolución de llamada.

¿Cómo puedo implementar correctamente este consentimiento de OAuth2 para no tener que pedir al usuario que seleccione su cuenta dos veces?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar que el usuario tenga que seleccionar su cuenta dos veces, puedes agregar el parámetro “prompt=select_account” a la URL de autorización. Esto le indica a Google que solicite al usuario seleccionar su cuenta solo una vez durante el flujo de consentimiento. Aquí tienes un fragmento de código actualizado:

    $payload = $client->verifyIdToken($id_token); // Procesar el JWT
    if ($payload) {
        $userid = $payload['sub']; // Obtener el ID único de Google del usuario
        $client->setLoginHint($userid); // Establecer el ID del usuario como pista para el próximo consentimiento
        $client->setPrompt('consent'); // Establecer la solicitud de aprobación solo para el consentimiento
        $client->setScopes(...);
        $client->setAccessType('offline');
        $client->setRedirectUri(...);
    
        // Agregar prompt=select_account a la URL de autorización
        $auth_url = $client->createAuthUrl(['prompt' => 'select_account']);
    
        header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
    }
    

    Con este cambio, al usuario se le pedirá que seleccione su cuenta solo una vez, durante el flujo de autenticación inicial.

Comments are closed.