¿Cómo mantengo a un usuario conectado a mi sitio durante meses?

Estoy usando OpenID. ¿Cómo lo hago para que el usuario permanezca conectado durante mucho tiempo incluso después de cerrar la ventana del navegador?

¿Cómo almaceno y obtengo acceso al objeto User del User ?

Básicamente, supongo que simplemente no entiendo cómo funcionan las sesiones en Java.

¿De verdad quieres una opción “Recordarme en esta computadora”? Esto en realidad no está relacionado con la parte de OpenID. Aquí hay una manera independiente del idioma de cómo puedes hacerlo:

  • Primero crea una tabla DB con al menos las columnas cookie_id y user_id . Si es necesario también agregue un cookie_ttl y un ip_lock . Los nombres de columna hablan por sí mismos, supongo.

  • En el inicio de sesión por primera vez (si es necesario solo con la opción “Recordarme” marcada), genere una clave larga, única y difícil de adivinar (que no está relacionada de ninguna manera con el usuario) que representa el cookie_id y almacénelo en el DB junto con el user_id . Almacene el cookie_id como valor de cookie de una cookie con nombre de cookie conocido, por ejemplo, remember . Dale a la cookie una larga vida, por ejemplo, un año.

  • En cada solicitud, verifique si el usuario está conectado. De lo contrario, verifique el valor de cookie cookie_id asociado con el nombre de la cookie. Si está allí y es válido de acuerdo con la base de datos, entonces inicie automáticamente el usuario asociado con el user_id y posponga nuevamente la edad de la cookie y, si la hay, también la cookie_ttl en DB.

En términos de Java / JSP / Servlet, utilice HttpServletResponse#addCookie() para agregar una cookie y HttpServletRequest#getCookies() para obtener cookies. Puede hacer todas las primeras comprobaciones en un Filter que escuche en los recursos deseados, por ejemplo /* o tal vez un poco más restringido.

Con respecto a las sesiones, no lo necesita aquí. Tiene una vida útil más corta de lo que necesita. Úselo únicamente para poner al usuario que inició sesión o al usuario “encontrado” cuando tiene una cookie de remember válida. De esta forma, el Filter solo puede verificar su presencia en la sesión y luego no necesita verificar las cookies cada vez.

Después de todo, es bastante sencillo. Buena suerte.

Ver también:

  • Cómo implementar “Permanecer conectado” cuando el usuario inicia sesión en la aplicación web
  • ¿Cómo funcionan los servlets? Instanciación, sesiones, variables compartidas y multihilo

Bueno, la razón original por la que elegí OpenID fue para que alguien más pudiera manejar la mayor parte de la implementación y la seguridad de la autenticación para mí.

Después de investigar más sobre OpenID, parece que hay algo llamado “solicitud inmediata” ( http://openid.net/specs/openid-authentication-2_0.html#anchor28 ).

Al solicitar la autenticación, la Parte que Confía PUEDE solicitar que el OP no interactúe con el usuario final. En este caso, el PO DEBE responder de inmediato con una afirmación de que la autenticación es exitosa o una respuesta que indique que la solicitud no se puede completar sin la interacción del usuario.

Debido a esto, creo que podría simplemente almacenar el URL de usuario abierto del usuario en la cookie, y usar una solicitud inmediata para ver si el usuario está autenticado o no. De esta forma, no tengo que hacer nada con mi base de datos ni implementar ninguna lógica para evitar el secuestro de la cookie de larga duración.

Este método de hacerlo parece ser la forma en que OpenID sugiere hacerlo con su documento Best Practices de Confying Party .