¿Cómo conectar al usuario con una cookie de inicio de session en PHP?

Antes que nada, estoy probando en localhost. Tengo este file index.php que contiene la siguiente casilla "recordarme":

<input type="checkbox" id="login_remember" name="login_remember"> 

El formulario de inicio de session se publica en loginvalidate.php, que incluye el siguiente script php. He incluido muchos comentarios para facilitar el process de lectura de mi código. Tenga en count que estoy bastante seguro de que todo lo que sigue funciona bien.

 if (isset($_POST['login_submit'])) { //SETS VARIABLES FROM FORM $email = $_POST[trim('login_email')]; $password = $_POST['login_password']; $remember = isset($_POST['login_remember']) ? '1' : '0'; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE $query = "SELECT password FROM registenetworkingusers WHERE email = '$email'"; $result = mysqli_query($db_handle, $query) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result); $numrows = mysqli_num_rows($result); if ($numrows!=0) //IF EMAIL IS REGISTERED { if ($row['password'] == $password) { //IF PASSWORD IN DATABASE == PASSWORD INPUT FROM FORM if ($remember == '1'){ //IF USER WANTS TO BE REMEMBERED $randomNumber = rand(99,999999); //RANDOM NUMBER TO SERVE AS A KEY $token = dechex(($randomNumber*$randomNumber)); //CONVERT NUMBER TO HEXADECIMAL FORM $key = sha1($token . $randomNumber); $timeNow = time()*60*60*24*365*30; //STOCKS 30 YEARS IN THE VAR $sql_database = "registenetworkingusers"; $sql_table = "rememberme"; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE $query_remember = "SELECT email FROM rememberme WHERE email = '$email'"; //IS THE USER IN TABLE ALREADY $result = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); if (mysqli_num_rows($result) > 0) { //IF USER IS ALREADY IN THE REMEMBERME TABLE $query_update = "UPDATE rememberme SET email = '$email' user_token = '$token' token_salt = '$randomNumber' time = '$timeNow'"; } else { //OTHERWISE, INSERT USER IN REMEMBERME TABLE $query_insert = "INSERT INTO rememberme VALUES( '$email', '$token', '$randomNumber', '$timeNow' )"; } setcookie("rememberme", $email . "," . $key, $timenow); } header('Location: homepage.php'); //REDIRECTS: SUCCESSFUL LOGIN exit(); } 

Luego, cuando cierro el browser de Internet y vuelvo a index.php, quiero que la cookie conecte automáticamente al usuario. Esto está en mi index.php:

 include 'db_connect.php'; $sql_database = "registenetworkingusers"; $db_found = mysqli_select_db($db_handle,$sql_database); //OPENING TABLE session_start(); if (isset($_COOKIE['rememberme'])) { $rememberme = explode(",", $_COOKIE["rememberme"]); $cookie_email = $rememberme[0]; $cookie_key = $rememberme[1]; $query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'"; //IS THE USER IN TABLE ALREADY $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result_remember); $token = $row['user_token']; $randomNumber = $row['token_salt']; $key = sha1($token . $randomNumber); //ENCRYPT TOKEN USING SHA1 AND THE RANDOMNUMBER AS SALT if ($key == $cookie_key){ echo "lol"; } } 

El problema es que nunca se hace eco de "lol". Además, ¿alguien tiene alguna idea sobre cómo podría conectar a los usuarios? AKA, ¿qué debería ir dentro de estas líneas?

 if ($key == $cookie_key){ echo "lol"; } 

¡Gracias! Todavía soy nuevo en PHP y SQL así que por favor tengan paciencia si he cometido algunos errores de principiante.

¡EDITAR !: Después de mirar una y otra vez mi código, creo que mi error podría estar en estas líneas. No estoy seguro acerca de la syntax, y el método que estoy usando para almacenar valores en $ token y $ randomNumber:

 $query_remember = "SELECT * FROM rememberme WHERE email = '$cookie_email'"; //IS THE USER IN TABLE ALREADY $result_remember = mysqli_query($db_handle, $query_remember) or die (mysqli_error($db_handle)); $row = mysqli_fetch_assoc($result_remember); $token = $row['user_token']; $randomNumber = $row['token_salt']; 

Básicamente, hay dos maneras de implementar un script de inicio de session en PHP:

  1. Usando Sesiones
  2. Usando cookies

Trataré de explicar ambos usos en forma cruda a continuación, así que ten en count que hay mucho más que saber sobre cada uno de ellos.

Usando Sesiones

Haciéndolo simple, las sesiones son únicas y viven mientras la página esté abierta (o hasta que expire). Si su browser está cerrado, sucede lo mismo con la session.

¿Cómo usarlo?

Son bastante simples de implementar. Primero, asegúrese de comenzar las sesiones al comienzo de cada página:

 <?php session_start(); ?> 

Nota: Es importante que esta llamada sea anterior a cualquier salida de página , o resultará en un error de "encabezados ya enviados".

Bien, ahora tu session está en marcha. ¿Qué hacer después? Es bastante simple: el usuario envía su nombre de usuario / contraseña a través del formulario de inicio de session, y usted lo valida. Si el inicio de session es válido, guárdelo en la session:

 if($validLoginCnetworkingentials){ $_SESSION['user_id'] = $id; $_SESSION['user_login'] = $login; $_SESSION['user_name'] = $name; } 

o como una matriz (que prefiero):

 if($validLoginCnetworkingentials){ $_SESSION['user'] = array( 'name' => $name, 'login' => 'login', 'whichever_more' => $informationYouNeedToStore ); } 

Ok, ahora su usuario ha iniciado session. Entonces, ¿cómo puede saber / verificar eso? Simplemente verifique si existe la session de un usuario.

 if(isset($_SESSION['user_id'])){ // OR isset($_SESSION['user']), if array // Logged In }else{ // Not logged in :( } 

Por supuesto, puede ir más allá, y además de verificar si existe la session, busque la ID de usuario almacenada en la session en la database para validar al usuario. Todo depende de la cantidad de security que necesita.

En la aplicación más simple, nunca existirá un $ _SESSION ['user'] a less que lo configure manualmente en la acción de inicio de session. Entonces, simplemente verificar su existencia le dice si el usuario está conectado o no.

Loggin out: solo destrúyalo. Podrías usar

 session_destroy(); 

Pero tenga en count que esto destruirá todas las sesiones que haya configurado para ese usuario. Si también usó $ _SESSION ['foo'] y $ _SESSION ['bar'], esos también se habrán ido. En este caso, simplemente desarma la session específica:

 unset($_SESSION['user']); 

¡Y hecho! ¡El usuario ya no está conectado! 🙂

Usando cookies

Las cookies funcionan de forma similar, salvo que se almacenan en el browser del cliente y duran todo el time que se lo indique. Por ejemplo, usaba cookies "como sesiones" cuando las configuraba para caducar a $ timeNow .

Por lo general, no me gusta usar cookies para inicios de session sencillos ya que requieren comprobaciones de security más avanzadas. Dado que se almacenan en el browser de los usuarios, pueden manipularse fácilmente y los usuarios malintencionados pueden generar información de inicio de session falsa e iniciar session en su sistema.

¿Cómo usarlo?

Casi como lo haces con las sesiones. La diferencia se basa en configurar / desactivar la cookie:

 // To set a Cookie // You could use the array to store several user info in one cookie $user = array( 'id' => $id, 'name' => $name, 'login' => $login, ) setcookie("loginCnetworkingentials", $user, time() * 7200); // Expiring after 2 hours // Now to log off, just set the cookie to blank and as already expinetworking setcookie("loginCnetworkingentials", "", time() - 3600); // "Expires" 1 hour ago 

Para verificar si un usuario está conectado, puede usar el mismo ejemplo que en la session, pero usando una variable diferente: $ _COOKIE

 if(isset($_COOKIE['user']['id'] && !empty(isset($_COOKIE['user']['id']))){ // Logged In }else{ // Not logged in :( } 

Bueno, eso es todo. Para recordarle nuevamente, estos son ejemplos de methods de inicio de session muy simples . Tendrá que estudiar un poco más sobre ambos methods y mejorar su código con algunas capas más de controles de security dependiendo de los requisitos de security de su aplicación.

la razón detrás de su código no está funcionando es

  setcookie("rememberme", $email . "," . $key, $timenow); // this is getting expire exactly at same time when it is set 

replacelo con

  setcookie("rememberme", $email . "," . $key, time() * 3600);//expire after 1hour 
    Intereting Posts