El sistema de usuarios se utiliza para permitir que personas accedan en áreas restringidas de tu aplicación, e incluso, realicen modificaciones en ella.
Un sistema de usuarios consta de al menos 3 partes: el registro, el manejo de sesiones y la entrega de permisos. De la primera parte trataremos en este artículo.
El registro consiste en acreditar la identidad de un visitante y otorgarle una credencial, cada vez que éste quiere ingresar a tu aplicación. La credencial será una sesión de usuario. A su vez, no todos los usuarios tienen los mismos privilegios de ingreso, por lo tanto, habrá diferentes permisos de acceso.
Volviendo al tema del artículo, un registro de usuarios es, en resumen, la puerta grande de ingreso a nuestra aplicación. En la práctica, consiste en un montón de pequeñas puertas que, de no prestar suficiente atención, pueden generar un problema en la seguridad.
En el registro de usuarios, una puerta puede abrirse a través de:
- el método de verificación de dirección de correo electrónico, cuando el usuario no se encuentra registrado o cuando el usuario haya perdido sus datos de verificación. Hoy en día, muchas veces se reemplaza este método por el de verificación del número de teléfono móvil;
- el ingreso de un usuario y una contraseña, cuando el usuario ha sido previamente verificado;
Método de verificación de correo electrónico
El método es común, consiste en enviar un mensaje al correo del posible usuario, conteniendo un token único portado en un enlace. El usuario debe seguir el enlace, que lo regresa a nuestro sitio web, donde allí se verificará el token y, en consecuencia, la dirección de correo electrónico.
Esquema
Un esquema posible para el registro de usuarios es el siguiente:

Registro (Sign up)
En el punto 1 del esquema, un visitante se registra en nuestro sitio web a través de un formulario. Completado el mismo, se envía el token para verificar su correo electrónico.
Puede ocurrir que el visitante demore la verificación y el token caduque (me ha pasado), lo que nos obliga a dar la posibilidad de ofrecerle otro.
Registro automático
En el punto 2 del esquema, hay una alternativa, que puede utilizarse en los casos en que:
- se tiene una dirección de correo, no necesariamente verificada, de un posible usuario. Como ser, de un registro a boletines.
- el visitante se registra a través de un medio alternativo. Por ejemplo, utilizando la cuenta de una red social, en donde la dirección de correo ya ha sido verificada.
En el esquema se valida la cuenta a través de un token, pero si confiamos en la validación hecha por terceros, esta se puede omitir.
Iniciar sesión (Log in)
En el punto 3 del esquema, un usuario registrado ha salido de su sesión. Para volver a ingresar deberá iniciar sesión. Acá puede ocurrir que el usuario complete los datos correctamente e ingrese sin dificultades, o que:
- el usuario falle el ingreso de datos. Opcionalmente, el sistema puede enviarle un token de ingreso automático (esto funciona bien para sitios no muy exigentes que desean no perder usuarios);
- el usuario olvide su contraseña, a lo que deberá gestionar una nueva.
Acerca de los tokens
Los tokens deben ser, además de lo suficientemente extensos, criptográficamente seguros. La validación de los tokens debe ser a tiempo constante, utilizando la función hash_equals. Además, es recomendable utilizar el token dividido (Recomendamos el artículo de Paragon).
El sistema de validación de direcciones de correos a través de tokens es tan importante, que debe tenerse en cuenta para ser utilizado por otras aplicaciones. Por ejemplo, en nuestro CMS, los boletines lo utilizan, lo que se vuelven lo suficientemente seguros como para que los suscriptos sean registrados sin una segunda validación.
Cómo es la implementación que hacemos en nuestro CMS
La implementación que hacemos no es muy diferente a lo expuesto. Sin embargo, el proceso de generar un token de validación parte de una actividad realizada por el usuario (aunque no toda actividad del usuario genera un token), de ahí que la validación de tokens se mezcla con los registros de actividades del usuario. Esto permite que el usuario pueda hacer el seguimiento y control de sus actividades, además de permitir al sistema agregar otras verificaciones de seguridad.