Recuperar Contraseña de forma segura (implementacion)

844 views
Skip to first unread message

Vitox

unread,
Aug 23, 2011, 4:59:37 PM8/23/11
to CakePHP en Español
Hola grupo

les comento mi problema, tengo una aplicacion, con manejos de
sesiones, multiples vistas, entre otras cosas. En estos momentos estoy
creando una forma de que cada usuario recupere su password cuando
estos lo han olvidado.

Mi logica que estoy siguiendo es la siguiente:
1° el usuario entra a una vista en donde ingresa su nombre de usuario
2° una vez confirmado que existe, le envio un mail informandole que se
ha solicitado la recuperacion de contraseña y le adjunto un link(lleva
por parametro el id del usuario) que me lleva a la vista en la cual el
usuario debe escribir y confirmar su nueva contraseña

como ya conosco el ID del usuario, entonces puedo acceder a su
informacion personal (login, pass, email, etc) y lo que quiero hacer
es que cuando haga "click" en el link que le llega a su correo, el
usuario se logee automaticamente y le permita visualizar la vista
donde escribira su contraseña.
Como la vista debe ser privada, no puedo acceder a ella, he intentado
varios metodos para iniciar sesion automaticamente pero ninguno con
exito.

Alguna idea que pueda implementar? estuve viendo que existe el "Auth"
y por los ejemplos que econtre por internet no lo pude solucionar

uso cake version 1.2 + netbeans + ubuntu + mysql

Sebastian Maydana

unread,
Aug 23, 2011, 11:00:17 PM8/23/11
to cakep...@googlegroups.com
Hola no se si te serva de ayuda, pero en mis aplicaciones lo que hago para recuperar o reestablecer una contraseña, le pido al usuario que ingrese su direccion de correo la cual valido si existe, y si esta registrada se le envia un correo con una contraseña generada aleatoriamente, despues el usuario ingresa y cambia su clave a su gusto.
Espero que te sirva de ayuda la idea, un abrazo.

Sebastian


--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.


Mariano Agustin Reyes

unread,
Aug 24, 2011, 8:45:09 AM8/24/11
to cakep...@googlegroups.com
Yo creo que es más segura la idea de Sebastián.

Vitox

unread,
Aug 24, 2011, 8:49:44 AM8/24/11
to CakePHP en Español
El problema de ese metodo es que cualquier persona que conosca mi
correo podria solicitar mi cambio de clave, es por eso que quiero
enviar un correo que diga "Se ha solcitado un cambio de clave, haga
clik en este link para confirmar" es por eso que necesito iniciar
sesion automaticamente y que lo redirija a la pagina de cambio de
contraseña, esto no lo veo "imposible" ya que conosco el ID del
usuario, el detalle es que no se como se hace el iniciar sesion
automaticamente jejej

saludos!

On Aug 24, 12:00 am, Sebastian Maydana <sebastianmayd...@gmail.com>
wrote:
> Hola no se si te serva de ayuda, pero en mis aplicaciones lo que hago para
> recuperar o reestablecer una contraseña, le pido al usuario que ingrese su
> direccion de correo la cual valido si existe, y si esta registrada se le
> envia un correo con una contraseña generada aleatoriamente, despues el
> usuario ingresa y cambia su clave a su gusto.
> Espero que te sirva de ayuda la idea, un abrazo.
>
> Sebastian
>

Christopher Castro

unread,
Aug 24, 2011, 10:34:27 AM8/24/11
to cakep...@googlegroups.com
Te explico un método bastante bueno, y que creo que es lo que preguntas (es conveniente que estudies un poco el componente Auth de cake).
Esta mecánica se llama "One Time Login". Es muy simple, eficiente y segura.
Sólo te explicaré en que consiste, luego tu debes investigar mas afondo y ver la forma e implementarlo:


1- En la tabla de users, ademas de tener un campo para almacenar la contraseña encriptada se agrega un campo adicional 'KEY',
éste campo debe actualizarse cada vez que que se haga un UPDATE/INSERT sobre un registro [beforeSave()] y debe contener una llave aleatoria (Yo personalmente uso strings uuid).


2- La mecánica de recuperación de contraseña es la típica:
Se envia un correo y en él un vinculo a una direccion que hace "algo" para recuperar la clave, bien, pues la mecanica de "One Time Login" lo que hace es que se recibe desde la url (link del email) el ID de usuario y su KEY, se hace una búsqueda sobre la DB del usuario correspondiente, y si existe SE LE DA ACCESO al sistema para que desde su panel de "Mi cuenta" pueda cambiar la clave.
Es decir sería como hacer un simple LOGIN pero usando como clave la KEY aleatoria.

Recuerda que una vez que se identifica debes nuevamente regenerar la KEY !.
Lo que yo hago es que cada vez que alguien se identifica almaceno en un campo un 'laslogin' con el timestamp de cuando se identificó.
Entonces pongo la logica que genera las KEY en algun callback save(), luego al guardar el 'lastlogin' se lanza esta logica y se regenera la key automaticamente y asi no me preocupo de recordar cuando se deben regenerar las keys porque siempre se que se lanzar al ahcer un Update/Insert.


PD: Si necesitas algun código de apoyo/ejemplo puedes descargar mi CMS que utiliza esta misma mecánica.
Esta hecho con cakephp 2.0 pero no difiere en mucho la forma de implementarlo en 1.3 o 1.2.
El link al repo de github esta en mi firma, hechale un ojo al controlador UserController.php del plugin 'user'

Salu2
--
Christopher Castro.
Analista Programador Senior PHP/MySQL
Pamplona, España
QuickApps.es
https://github.com/y2k2000/QuickApps

$pyd3r

unread,
Aug 24, 2011, 3:58:28 PM8/24/11
to CakePHP en Español
Bueno yo tengo otra mecánica

Yo uso un modulo que se encargar de realizar este proceso. Explico
como funciona
1. El usuario entra en una vista donde se le solicita su email y que
llene un captchar (uso el de google)
2. Se validan los datos si los datos son correctos procede al paso 3
sino solo confirma el envió de correo (esto es para que un usuario no
intente usar varios correos buscando un resultado.
3. Este genera en una tabla aparte una contraseña y un keytoken y la
hora que se creo la contraseña. Se envía un correo con el KeyToken al
correo introducido.
4. El correo le indica al usuario que se solicito un cambio de
contraseña y para poder realizar el proceso debe validar el proceso
haciendo click en el vinculo que trae el correo.
5. Si hace click en el vinculo llega a una vista que el confirma que
se a validado el proceso y se le enviara la contraseña, dentro de la
validación se verifica la hora que es y la que se guardo en la base de
datos si ha pasado más de 24 hora envía un error que el token no es
valido.
6. Se envía un correo con la nueva contraseña y se actualiza la nueva
contraseña en la tabla de usuarios.

Espero que me entiendan cualquier pregunta estoy a la orden.
> QuickApps.es <http://www.quickapps.es/>https://github.com/y2k2000/QuickApps
Reply all
Reply to author
Forward
0 new messages