Nov 162014
 
Artículo PHP

Para ofrecer un servicio personalizado en un sitio web, es necesario implementar un mecanismo de registro de usuarios, y un procedimiento de login. Una vez que el usuario se ha validado, se puede dar acceso a funcionalidad específica del sitio que requiere el uso de la información asociada al usuario.

En este artículo se presenta una posible implementación de la funcionalidad de registro y validación de usuarios en lenguaje PHP.

1. Formulario de registro

El formulario de registro debe recoger como mínimo el identificador de usuario y la contraseña que serán utilizadas posteriormente para la validación del usuario. Es muy habitual que se solicite también una dirección de correo y cada vez más la dirección de correo es utilizada como el identificador de usuario.

Adicionalmente, el formulario puede solicitar información adicional: edad, sexo, dirección,… Algunos de estos datos pueden ser opcionales u obligatorios, dependiendo del tipo de servicio que ofrece el sitio web.

Por ejemplo, el siguiente código HTML genera un formulario que solicita una dirección de email y contraseña, y ofrece la opción de suscribirse a un boletín de noticias:

<form method="POST" action="/register.php" accept-charset="utf-8">
  <label for="signup_email">Email</label>
  <input type="text" name="signup_email" value="" id="signup_email" maxlength="255" size="30"  />
  <label for="signup_password">Contraseña</label>
  <input type="password" name="signup_password" value="" id="signup_password" size="30"  />
  <label for="sconfirm_password">Confirmar Contraseña</label>
  <input type="password" name="confirm_password" value="" id="signup_confirm_password" size="30"  />
				  
  <input type="checkbox" name="signup_newsletter" value="subscribed" checked="checked" 
                         id="signup_newsletter" class="chk-signup" />
				 
  <label for="signup_newsletter" class="txt-signup">Deseo recibir noticias, actualizaciones de
                            software, y la última información relativa a productos y servicios.
  </label>
  <input type="submit" name="signup_submit" value="Registrarse" class="btn">
</form>

Con este código HTML (y el correspondiente código CSS), el formulario resultante es de la forma:

formulario-de-registro

2. Proceso del formulario de registro de usuario

Al pulsar en el botón “Registrarse”, el contenido del formulario es enviado al script “register.php” para su proceso.

Previamente al envío, en un servicio en producción, el formulario incluye algún tipo de validación de los datos (Para verificar que la sintaxis de la dirección de email es correcta, el contenido de los campos “Contraseña” y “Confirmar contraseña coincide”, la contraseña tiene una longitud mínima, etc.) mediante una función javascript que se ejecuta asociada al evento “onsubmit”.

De todas maneras, es conveniente realizar también este tipo de validación en el servidor, en el script “register.php” que procesa el formulario.

Este script puede tener la estructura siguiente:

    // Leer los datos del formulario
    ...

    // Realizar la validación de los datos
   ...

    // Insertar el usuario en la base de datos
    ...

    // Enviar un email de confirmación
    ...

2.1. Leer los datos recibidos del formulario

El formulario de registro del ejemplo especifica method=”POST”. Por lo tanto, los valores de los campos del formulario son accesibles para el script PHP en forma de elementos del array $_POST:

// Leer los datos del formulario
$email = $_POST["signup_email"];
$password = $_POST["signup_password"];
$newsletter = $_POST["signup_newsletter"];

2.2. Realizar la validación de los datos

La validación más elemental del formulario de registro incluye comprobar que la contraseña introducida tiene una longitud mínima, y que la contraseña de confirmación coincide. Si alguna de estas comprobaciones falla, se genera el correspondiente mensaje de error:

// Realiza la validación
$error_message = ""
if (strlen($password) < 6) {
    $error_message = "La contraseña es demasiado corta. Por favor, introduzca al menos 6 caracteres";
} else if ( $password != $_POST["signup_confirm_password"]) {
    $error_message = "Las contraseñas no coinciden. Por favor, inténtelo de nuevo";
}

Por otra parte, es conveniente comprobar que la sintaxis de la dirección de correo es correcta. Se puede utilizar la función PHP estándar filter_var() para realizar esta comprobación:

if ( ! filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $error_message = "Por favor, compruebe la dirección de email introducida";
}

Nota: filter_var() se puede utilizar también para comprobar la validez de otros tipos de datos, si se han incluido en el formulario, utilizando el tipo de validación correspondiente: FILTER_VALIDATE_BOOLEAN, FILTER_VALIDATE_INT, FILTER_VALIDATE_IP, FILTER_VALIDATE_URL, etc. La lista completa de tipos de filtros de validación disponibles se puede consultar aquí

2.3. Insertar el usuario en la base  de datos

La aplicación debe almacenar la relación de usuarios registrados en alguna parte. En esta guía supondremos que se utiliza una tabla ‘usuarios’ en una base de datos mysql para contener los datos relativos a los usuarios registrados.

La tabla ‘usuarios’ incluye los siguientes campos:

  • `email`  – dirección de email. Este campo debe ser la clave primaria de la tabla, para evitar duplicados.
  • `password` – contraseña
  • `newsletter` – indica si el usuario desea (newsletter=1) o no (neswletter=0) recibir el boletín de noticias y otros emails del sitio web.
  • `registration_date` timestamp DEFAULT CURRENT_TIMESTAMP – fecha en la que se ha realizado el registro.
  • `activation_key` – clave de activación que se usa para confirmar la dirección de correo, como se explica en el siguiente apartado
  • `validated` – indica que la dirección de correo ha sido confirmada

El proceso de registro debe comprobar si la dirección de correo introducida existía previamente en la tabla de usuarios. Si el campo ‘email’ es la clave primaria de la tabla, esta comprobación puede realizarse en la sentencia de inserción del registro, porque la inserción fallará con un error de clave duplicada si el usuario estaba ya registrado.

// Insertar usuario en la base de datos
$random_key = generate_random_key();
$stm = $dbh->prepare("insert into usuarios (email,password,activation_key,validated) " .
                     "values ( ? , ? , ? , 0 )");
$stm->bind_param("sss",$email,$password,$random_key);
if (!$stm->execute()) {
    // La inserción puede fallar si el usuario ya existía en la base de datos
    $error_message = "Error, el usuario ya existía en la base de datos";
} else {
    // Enviar un mensaje para confirmar la dirección de correo del usuario
    ...
}

La función “generate_random_key()” genera una clave de activación aleatoria de 32 caracteres. Se puede implementar de la siguiente forma:

function generate_random_key() {
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";

    $new_key = "";
    for ($i = 0; $i < 32; $i++) {
        $new_key .= $chars[rand(0,35)];
    }
    return $new_key;
}

2.4. Enviar un email de confirmación

Tras insertar el usuario en la tabla, se envía un mensaje de confirmación a la dirección de correo del mismo. El mensaje incluye un enlace sobre el que el usuario debe hacer click para confirmar el registro. Una posible implementación de este envío puede realizarse utilizando la función estándar de PHP mail():

           // Enviar un mensaje para confirmar la dirección de email introducida
            mail($email,"ejemplo.com - Activación de la cuenta",
                "Bienvenido a ejemplo.com!
        
                Gracias por registrarse en nuestro sitio.
                Su cuenta ha sido creada, y debe ser activada antes de poder ser utilizada.
                Para activar la cuenta, haga click en el siguiente enlace o copielo en la
                barra de direcciones del navegador:
                http://ejemplo.com/activate.php?activation=".$random_key);

Cuando el usuario recibe el mensaje y hace click sobre el enlace, en el servidor se ejecuta el script “activate.php”. El script recibe la clave de activación que ha sido pasada en la url como el valor del argumento “activation”.

La misión principal del script activate.php es poner a uno el valor del campo “validated” en la tabla de usuarios. A continuación, inicia una sesión con el nuevo usuario y presenta un mensaje de confirmación:

    $activation_key = $_GET["activation"];
    $dbh = get_dbh();
    // Busca la entrada en la tabla de usuarios para la clave de activación recibida
    $stm = $dbh->prepare("select count(1) from users where activation_key=?");
    $stm->bind_param("s",$activation_key);
    $stm->bind_result($total);
    $message = "";
    $stm->execute();
    $stm->fetch();
    $stm->close();
    if ($total == 1) { // Si se ha encontrado...
        // Retrieve the email address
        $stm = $dbh->prepare("select email from users where activation_key=?");
        $stm->bind_param("s",$activation_key);
        $stm->bind_result($email);
        $stm->execute();
        $stm->fetch();
        $stm->close();
        // Poner a uno el campo validated en la tabla usuarios
        $stm = $dbh->prepare("update usuarios set validated=1 where activation_key=?");
        $stm->bind_param("s",$activation_key);
        $stm->execute();
        $stm->close();
        // Introducir al usuario en sesión
        $_SESSION["user"] = $email;
        $message .= "Gracias por registrarse con nosotros<br/><br/>" .
            "¡Bienvenido a ejemplo.com!<br/><br/>" .
            "<a href='http://ejemplo.com' class=\"btn\"'>Continuar</a>";

Y con esto finaliza el proceso de registro

3. Formulario de login

El formulario de login contiene simplemente un campo “email” y un campo “clave”, que son enviados a un script “login.php”. Es habitual incluir también en el mismo un enlace a la funcionalidad de “Olvidó su contraseña”, como se puede ver en el siguiente ejemplo:

  <form method="POST" action="/user/login.php">
      <label class="email">Email</label>
      <input type="text" name="user">
      <label class="pww">Clave</label>
      <input type="password" name="pass">
      <a href="/olvido.php" role="button" data-toggle="modal">¿Olvidó su contraseña?</a>
      <input type="submit" class="btn" name="login" value="login">
  </form>

Con este código html y una hoja de estilo CSS, podemos conseguir que el formulario tenga el siguiente aspecto:

El script “login.php” debe confirmar que la entrada correspondiente a la dirección de correo y contraseña introducidas existe en la tabla de usuarios, y si es así introducir al usuario en sesión:

//Validar usuario y contraseña
$email = $_POST["user"];
$password = $_POST["pass"];

$stm = $dbh->prepare("select email from users where email=? and password=?");
$stm->bind_param("ss",$email,$password);
$stm->execute();
$login_error_message = "";
if ($stm->fetch()) {
    $_SESSION["user"] = $email;
    // Redirigir al usuario a la página de inicio del sitio
    header( 'Location: http://ejemplo.com/' );
    return;
} else {
    // Presentar mensaje de error
        ...
}

 Publicado por en 2:12 pm

 Deja un comentario

(requerido)

(requerido)