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.

Keycloak – inicio de sesión automático después de restablecer la contraseña.

Actualmente tengo configurado Keycloak con éxito con una aplicación frontend (react) y backend (django) con 2 clientes. Uno para el backend con tipo de acceso “confidential” y el segundo para la autenticación del frontend con tipo de acceso “public”.

Estoy tratando de completar una funcionalidad donde podamos iniciar el envío de un correo electrónico para restablecer la contraseña de un usuario (desde el lado administrativo del frontend) y logré que funcione utilizando la siguiente llamada “PUT” según la documentación aquí:

https://auth.domain.com/auth/admin/realms/realm-dev/users/c78263n-f7gb-47c4-a7450-9092ae08efed/execute-actions-email?redirect_uri=http%3A%2F%2Flocalhost%3A3000%2F&client_id=app-front&lifespan=259200

con la siguiente carga útil: ["VERIFY_EMAIL","UPDATE_PASSWORD"]

El usuario luego recibe un correo electrónico con un enlace para realizar las acciones mencionadas.

Hasta aquí todo bien.

El problema es que una vez que el usuario ha completado la actualización de su contraseña en Keycloak y hace clic en “volver a la aplicación”, debe iniciar sesión nuevamente. ¿Existe alguna manera de iniciar automáticamente la sesión del usuario después de establecer su contraseña a través de este flujo de trabajo?

He intentado lo siguiente en el lado de react, pero eso no ayudó y creó un pequeño bucle de redireccionamiento hasta establecerse nuevamente en el formulario de inicio de sesión:

import Keycloak from 'keycloak-js';

const keycloak = Keycloak(process.env.REACT_APP_KEYCLOAK_JSON);

keycloak.init({
  onLoad: 'check-sso',
  silentCheckSsoRedirectUri: `${window.location.origin}/silent-check-sso.html`,
  pkceMethod: 'S256',
});

export default keycloak;

Agradecería cualquier ayuda para completar la implementación de esto.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Auto-inicio de sesión del usuario después de restablecer la contraseña en Keycloak

    Desafortunadamente, no hay una forma directa de auto-iniciar sesión del usuario después de que restablezcan su contraseña a través del enlace de correo electrónico en Keycloak. Esto se debe a que una vez que el usuario actualiza su contraseña, están iniciando sesión nuevamente y la sesión para la sesión de inicio de sesión anterior se invalida.

    Sin embargo, existen algunas soluciones alternativas que se pueden implementar para lograr un resultado similar:

    1. Solicitar al usuario que inicie sesión nuevamente

    Una solución alternativa simple es solicitar al usuario que inicie sesión nuevamente después de completar el proceso de restablecimiento de contraseña. Esto se puede hacer mostrando un formulario de inicio de sesión o redirigiendo al usuario a la página de inicio de sesión. Esto asegura que el usuario tenga una sesión autenticada después de restablecer su contraseña.

    2. Utilizar un token de actualización

    Si estás utilizando el adaptador de Javascript de Keycloak, puedes utilizar un token de actualización para refrescar la sesión del usuario después de que restablezcan su contraseña. Esto permite que el usuario permanezca conectado sin tener que iniciar sesión manualmente nuevamente. Esto se puede lograr modificando la función init para la instancia de Keycloak. Aquí tienes un ejemplo:

    const keycloak = Keycloak(process.env.REACT_APP_KEYCLOAK_JSON);
    
    keycloak.init({
      onLoad: 'check-sso',
      silentCheckSsoRedirectUri: `${window.location.origin}/silent-check-sso.html`,
      pkceMethod: 'S256',
      checkLoginIframe: false, // Indica no comprobar el estado de inicio de sesión automáticamente
    }).then((authenticated) => {
      if (authenticated) {
        // El usuario está autenticado, actualizar el token para mantener la sesión
        return keycloak.updateToken(60).then((refreshed) => {
          if (refreshed) {
            console.log('Token actualizado exitosamente');
          } else {
            console.log('Token no actualizado, válido por '
              + Math.round(keycloak.tokenParsed.exp + keycloak.timeSkew - new Date().getTime() / 1000)
              + ' segundos');
          }
        }).catch((error) => {
          console.error('Error al actualizar el token:', error);
        });
      } else {
        // El usuario necesita iniciar sesión nuevamente
        keycloak.login();
      }
    }).catch((error) => {
      console.error('Error al inicializar Keycloak:', error);
    });
    

    3. Utilizar un token de portador en el enlace de correo electrónico

    Otra solución alternativa es incluir un token de portador en el enlace de correo electrónico de restablecimiento de contraseña. Este token de portador se puede utilizar para autenticar al usuario después de restablecer su contraseña. Sin embargo, este enfoque requiere implementar una solución de autenticación personalizada en el backend, ya que Keycloak no admite nativamente este tipo de autenticación.

    En conclusión, aunque no hay una forma directa de auto-iniciar sesión del usuario después de restablecer su contraseña en Keycloak, existen algunas soluciones alternativas que se pueden implementar para lograr un resultado similar. La mejor opción dependerá de los requisitos particulares de tu aplicación y del nivel de seguridad requerido.

Comments are closed.