Foros del Web » Programando para Internet » PHP »

Como generar enlaces para cambiar la password de un usuario en una web

Estas en el tema de Como generar enlaces para cambiar la password de un usuario en una web en el foro de PHP en Foros del Web. Hola a todos/as, No se si mi pregunta debe ir en esta sección del foro o en otra. No lo tengo nada claro, así que ...
  #1 (permalink)  
Antiguo 06/06/2014, 04:28
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 1 mes
Puntos: 7
Como generar enlaces para cambiar la password de un usuario en una web

Hola a todos/as,

No se si mi pregunta debe ir en esta sección del foro o en otra. No lo tengo nada claro, así que disculpen si no es el sitio correcto y ruego que lo muevan a la sección correspondiente.

Quiero hacer una cosa que he visto en muchas webs pero no tengo claro como lo suelen llevar a cabo.

A veces nos registramos en una Web y al momento nos llega al correo un email de dicha web con una url que al pinchar en ella nos redirige a una página de dicha web donde ya se nos ha iniciado sesión y nos muestra un formulario para insertar la password actual que ellos nos han enviado por correo y cambiarla por una nueva que nosotros queramos.

En mi caso, cuando se da de alta un usuario en la Web se le asigna una password determinada. Y lo que ahora debo hacer es enviarme un correo con un enlace a la Web donde se inicie automaticamente sesión en ella (sin que el usuario tenga que loguearse) y le muestre un formulario para que cambie la password que el sistema le ha asignado para su comodida.


Mis dudas, es que para que ese link le lleve a mi web e inicie sesion automaticamente, entiendo que en ese link debe aparecer tanto el email como la password que se le asigna al usuario por defecto. Lo que no se es como suelen hacer las Web para que esa información no aparezca legible en la url por temas de seguridad.

No se si alguien me puede arrojar un poco de luz sobre el tema???


Saludos.
  #2 (permalink)  
Antiguo 06/06/2014, 04:32
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Cita:
Iniciado por aeb_asturias Ver Mensaje
Hola a todos/as,

No se si mi pregunta debe ir en esta sección del foro o en otra. No lo tengo nada claro, así que disculpen si no es el sitio correcto y ruego que lo muevan a la sección correspondiente.

Quiero hacer una cosa que he visto en muchas webs pero no tengo claro como lo suelen llevar a cabo.

A veces nos registramos en una Web y al momento nos llega al correo un email de dicha web con una url que al pinchar en ella nos redirige a una página de dicha web donde ya se nos ha iniciado sesión y nos muestra un formulario para insertar la password actual que ellos nos han enviado por correo y cambiarla por una nueva que nosotros queramos.

En mi caso, cuando se da de alta un usuario en la Web se le asigna una password determinada. Y lo que ahora debo hacer es enviarme un correo con un enlace a la Web donde se inicie automaticamente sesión en ella (sin que el usuario tenga que loguearse) y le muestre un formulario para que cambie la password que el sistema le ha asignado para su comodidad.


Mis dudas, es que para que ese link le lleve a mi web e inicie sesion automaticamente, entiendo que en ese link debe aparecer tanto el email como la password que se le asigna al usuario por defecto. Lo que no se es como suelen hacer las Web para que esa información no aparezca legible en la url por temas de seguridad.

No se si alguien me puede arrojar un poco de luz sobre el tema???


Saludos.
  #3 (permalink)  
Antiguo 06/06/2014, 05:52
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Hola,

Colocas un enlace en el correo con una key generada como un hash o al azar (mejor aun), bastante complicada (alfanumerica, larga)

Cuando se sigue ese enlace el sistema recibe por GET esa variable que llamamos key, y busca en base de datos a que usuario en proceso de registro pertenece y le mostramos la seccion de "compeltar registro"

Aclaracion final, generalmente no iniciamos session sino luego que coloca esa contrasena sea por primera vez o restablecimiento le pedimos que se loguee.



Cita:
Mi duda es que para que ese link le lleve a mi web e inicie sesion automaticamente, entiendo que en ese link debe aparecer tanto el email como la password que se le asigna al usuario por defecto. Lo que no se es como suelen hacer las Web para que esa información no aparezca legible en la url por temas de seguridad.
__________________
Salu2!
  #4 (permalink)  
Antiguo 06/06/2014, 09:44
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 1 mes
Puntos: 7
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Muchas gracias Italico76 por responder.

Entonces, cada vez que se inserta un usuario nuevo en la base de datos debo generar una key que guardaré como un campo más de la tabla de clientes y que sea el que le envio al usuario por email y luego cuando el usuario pinche en dicho enlace, miro que usuario tiene asociado esa key y le muestro el formulario para cambiar la password. Y posteriormente ya podrá iniciar sesión con la nueva password no????

Esas url deberían tener un tiempo máximo de vida?, es decir, que si no pulsas esa url en X días deja de funcionar........???


Saludos y de nuevo gracias por la ayuda.
  #5 (permalink)  
Antiguo 06/06/2014, 09:54
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Cita:
Iniciado por aeb_asturias Ver Mensaje

Esas url deberían tener un tiempo máximo de vida?, es decir, que si no pulsas esa url en X días deja de funcionar........???
No creo sea buena idea,... lo harias volver a registrarse ? no me parece


Sin embargo, si quisieras hacerlo asi....... lo limpias de la base de datos!
__________________
Salu2!
  #6 (permalink)  
Antiguo 24/04/2016, 05:00
Avatar de Jfco  
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Cambiar el password de un usuario por su email
-------------------------------------------------------------

Se trata de un proceso que consta de varios modulos de codigo interconectados entre si.
Pasaremos variables: Datos de usuario o de Control de Acceso entre estos modulos de codigo.
A veces este paso de variables se hara mediante la clausula 'hidden' del formulario.

El numero de modulos y la cantidad de Controles de Acceso y verificacion de datos, lo decides tu
en funcion de como quieres que sea tu Aplicacion. Como minimo, utilizaras del orden de 5 formularios
de entrada o verificacion de datos, o modulos de codigo.

La idea principal, es generar un 'TOKEN' o 'KEY' que sera la Autorizacion para el usuairio. Dicho 'Key'
sera temporal, con vida: 24h, 48h, .... segun queramos. Transcurrido ese periodo, se destruira, y el
usuario perdera su Autorizacion para poder acceder a cambios en nuestra Base de Datos.

Ahora ese 'Token' lo vamos a guardar en una Base de Datos creada para la ocasion junto con el nombre de
usuario que lo genera. Ademas, deberemos borrar los posibles 'Token' anteriores a nombre del mismo usuario
y que esten guardados para evitar 'colisiones' futuras.

Por otro parte, ese 'Token' lo vamos a pasar mediante un email que enviaremos a la cuenta de correo del
usuario. En dicho email le pasaremos sus datos actuales, y un link para posibilitarle el cambio de su
clave de acceso.

Podremos pasar el link junto con el 'Token' y asi tendremos Autorizado el formulario para que proceda al
cambio de clave: "http://" . $host . $uri . "/validarclave.php?token=" . $token;

Cuando el usuario 'nos devuelva' mas adelante ese 'Token' ( mediante otro formulario ), comprobaremos
que el 'Token' que nos devuelve es el que tiene guardado y en vigor generado para la ocasion, con lo que
le podremos autorizar a hacer esos cambios, por ejemplo, cambio de clave de acceso.

La 'caducidad' de ese 'Token', la podemos programar con comandos directos SQL sobre la propia Base de datos
creada para guardar el 'Token'. Sera SQL quien borre ese registro cuando caduque el permiso:

CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 24 HOUR
DO
DELETE FROM `dolphin`.`tblreseteopass` WHERE `tblreseteopass`.`creado`
<= DATE_SUB(CURTIME(), INTERVAL 1 DAY)

Si todo es correcto, autorizaremos el cambio de clave, registraremos el cambio, borraremos el 'Token' y
posibilitaremos un report de cambios hechos por el usuario mediante un segundo email opcional.

Os dejo con un link Super-interesante!!!! y que a mi me hizo de guia y gran ayuda:

http://www.codedrinks.com/restablecer-contrasena-mediante-correo-electronico-con-php-y-mysql/
  #7 (permalink)  
Antiguo 24/04/2016, 05:03
Avatar de Jfco  
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Tambien os dejo la parte principal de mi codigo:

//Include the Mysql_conexion file...
//Obten la variable '$link' de conexion...
include 'conex.php';


//Ininializa las variables que se utilizan en este script...
$Autorizado = "not-user";
$Local = "not-nick";
$Clave = "not-pass";
$token = "not-token";


//Recupera el email pasado por el usuario en el anterior script...
$email = $_POST['email'];


//Obten nombre de usuario con dicho email...
$select='SELECT nombre,username FROM users WHERE email = "' . $email . '"';
$qry = mysql_query($select,$link)
or die('<BR>' . mysql_error() . '<BR><BR> Error_sql_command!!!... <BR>' . $select);
// Finaliza la Aplicacion!!!...

while($row = mysql_fetch_array($qry)) {
$Autorizado = $row[0];
$Local = $row[1];
}


//Obten el password de dicho email...
$select='SELECT clave FROM locales WHERE local="' . $Local . '"';
$qry = mysql_query($select,$link)
or die('<BR>' . mysql_error() . '<BR><BR> Error_sql_command!!!... <BR>' . $select);
// Finaliza la Aplicacion!!!...

while($row = mysql_fetch_array($qry)) {
$Clave = $row[0];
}



//Funcion main();
//------------

//Comprueba si el email pasado esta registrado...

//Si esta Autorizado dicho email...
//Le enviaremos un email al usuario con su clave actual y con un enlace para
//el cambio de clave el cual llevara la llave (token) con caducidad a las 24h...
//El codigo SQL para programar la caducidad en el registro es:

// Activa planificador de Eventos...
// SET GLOBAL event_scheduler = ON

// CREATE EVENT myevent
// ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 24 HOUR
// DO DELETE FROM `datos`.`tblreseteopass` WHERE `tblreseteopass`.`creado`
// <= DATE_SUB(CURTIME(), INTERVAL 1 DAY)


//Si no esta Autorizado dicho email...
//Aparece una pantalla de Error!!!. Dicha pantalla contiene un boton para
//redireccionar al usuario a un formulario para que se registre...

if($Autorizado != "not-user"){

echo "<br><br><div class='alert alert-warning'><strong>" . $email . "</strong>";
echo "<br><br>Local...";
echo "<br><strong>" . $Local . "</strong>";
echo "<br><br>Autorizacion...";
echo "<br><strong>" . $Autorizado . "</strong>";
echo "<br><br></div>";


//llamamos la funcion que nos va a generar la llave (token) con su link de
//acceso para el posible cambio de clave enviandolo por email al usuario.

$linkTemporal = generarLinkTemporal( $Local );

if($linkTemporal){

// the message html... mail($contact,$subject,$msg,$headers)...

$contact = $email;
$subject = "Recuperacion de Clave...";
$msg = "<html>
<head>
<title>Clave de acceso...</title>
</head>
<body>

<br><I>Destinatario...</I><br><strong>" . $contact . "</strong>
<br><br><I>Local...</I><br><strong>" . $Local . "</strong>
<br><br><I>Autorizacion...</I><br><strong>" . $Autorizado . "</strong>
<br><br><I>Clave...</I><br><strong>" . $Clave ."</strong>

<p><I><br>Haz clic en el enlace, para cambiar tu clave de acceso.
<br>Dispones de 24 horas para poder realizar dicho cambio!!!
<br><br>Si no funciona dicho enlace, accede a la direccion web indicada
<br>e introduce en ella el codigo de activacion.</I></p>

<br><label><strong><I><a href=" . $linkTemporal . "> Cambiar clave </I></a>
</strong></label>

<br><br><strong>Enlace web...</strong><br>" . $web . "<br><br>
<strong>Codigo de activacion...</strong><br>" . $token . "

</body>
</html>";


$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: <[email protected]>" . "\r\n";
$headers .= "Cc: <[email protected]>" . "\r\n";

// use wordwrap() if lines are longer than 70 characters
$msg = wordwrap($msg,70);


// send email and copy with Cc:...
mail(utf8_decode($contact),utf8_decode($subject),u tf8_decode($msg),utf8_decode($headers));


// say echo...
echo "<div class='alert alert-info'> Se ha enviado un correo de recuperacion ";
echo "de clave: <strong> [email protected] </strong> al email indicado.";

echo "<br> En dicho correo, se adjuntan las instrucciones y autorizacion ";
echo "para cambio de contraseña.";

echo "<br> Si no recibe tal correo, por favor pongase en contacto con nosotros ";
echo "a traves de: <strong>[email protected]</strong></div>";

}else{

//si se produce fallo de escritura 'mysql' nos re-enviamos un Report con el error...

echo '<form id="frmRestablecer" action="report.php" method="post">';

echo '<center><br><div class="alert alert-warning">';
echo "<I>Se ha producido un error al acceder a la Base de Datos... </I></B><br>";
echo "<N><I>Reintententelo trancurridos unos minutos... </I></N></B><br>";
echo "<br><IMG SRC='Logo7.jpg' WIDTH=100 HEIGHT=80><br><br>";
echo "<I> Si el problema persiste...</I><br>";
echo "<N><I> contacte con nuestro Administrador para solventarlo!!!</I></N>";

echo '<br><br><div class="form-group">';
echo '<input type="hidden" NAME="user" VALUE="' . $Autorizado .'"/>';
echo '<input type="hidden" NAME="local" VALUE="' . $Local .'"/>';
echo '<input type="hidden" NAME="email" VALUE="' . $email .'"/>';
echo '<input type="hidden" NAME="coment" VALUE="' . $error . $fail .'"/>';
echo '<input type="submit" class="btn btn-primary" value="Enviar informe" ><br>';
echo '</div>';

echo '</form>';
}


}else{

echo '<form id="frmRestablecer" action="registro.php" method="post">';

echo '<center><br><br><br><div class="alert alert-warning">';
echo "<IMG SRC='Logo7.jpg' WIDTH=100 HEIGHT=80><br><br>";

echo "<I>No existe una cuenta asociada a... </I><B>" . $email . "</B><br>";
echo "<I> Contacte con nuestro Administrador de cuentas para nuevo registro!!!</I>";

echo '<br><br><div class="form-group">';
echo '<input type="hidden" NAME="email" VALUE="' . $email .'"/>';
echo '<input type="submit" class="btn btn-primary" value="Registrar usuario" >';
echo '</div>';

echo '</form>';

}



function generarLinkTemporal($username){

//Declaramos 'variables globales'...
global $token, $web, $link, $error, $fail;


//obten el Token (llave) a pasar junto con el link...

//The sha1() function calculates the SHA-1 hash of a string...
//The md5() function calculates the MD5 hash of a string...

$cadena = $username.rand(1,9999999).date('Y-m-d');
//$token = sha1($cadena);
$token = md5($cadena);


//Borra los Token del usuario que esten guardados para evitar colisiones...
$select='DELETE FROM tblreseteopass WHERE username="' .$username . '"';
$result = mysql_query($select,$link);
// or die('<BR>' . mysql_error() . '<BR><BR> select_command... ' . $select);
// Finaliza la Aplicacion!!!...


if($result){
//Guardalo el nuevo Token para compararlo con el que 'pase' el usuario...
$select='INSERT INTO tblreseteopass (username, token) VALUES("' .$username . '","' . $token . '")';
$result = mysql_query($select,$link);
// or die('<BR>' . mysql_error() . '<BR><BR> select_command... ' . $select);
// Finaliza la Aplicacion!!!...
}


if($result){

$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$enlace = "http://" . $host . $uri . "/validarclave.php?token=" . $token;
$web = "http://" . $host . $uri . "/validarclave.php";

//echo "Token..." . $token . "<br>";
//echo "Ruta..." . $enlace . "<br>";
//echo "Ruta absoluta..." .dirname(__FILE__);

return $enlace;

}else{

$error= 'Validaremail(error!)... ' . mysql_error();
$fail = '<BR> Select_command... ' . $select;
return FALSE;
}
}

Última edición por Jfco; 08/05/2016 a las 03:43
  #8 (permalink)  
Antiguo 08/05/2016, 03:55
Avatar de Jfco  
Fecha de Ingreso: marzo-2016
Mensajes: 8
Antigüedad: 8 años, 1 mes
Puntos: 1
Respuesta: Como generar enlaces para cambiar la password de un usuario en una web

Durante el proceso suelen salir bastantes pegas, por lo que os aconsejo leer bastantes articulos. Por ejemplo, si no os funciona lo del 'borrado automatico del Token', podeis probar a hacerlo vosotros directamente insertando codigo en la cabecera del script que cambie la clave:

$select='DELETE FROM tblreseteopass WHERE DATE_ADD( creado, INTERVAL 1 DAY ) < CURDATE( )';
$qry = mysql_query($select,$link)
or die('<BR>' . mysql_error() . '<BR><BR> select_command... ' . $select);
// Finaliza la Aplicacion!!!...

Otro ejemplo es; si no os funciona o funciona cuando quiere, la funcion "mail()" para el envio del email. Podeis probar cosas bastante mas avanzadas como: "MAILGUN", "COMPOSER", ...

Os dedo este otro link para cuando tengais bastante adelantado vuestro proyecto y se trate de depurar problemas!...

https://styde.net/envio-de-correos-con-mailgun-en-laravel-5/

Última edición por Jfco; 08/05/2016 a las 04:02

Etiquetas: enlaces, formulario, password, usuario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:27.