Verificación de correo electrónico PHP

Resumen: en este tutorial, aprenderá a verificar la dirección de correo electrónico de la nueva cuenta de forma segura mediante un enlace de activación.

Introducción a la verificación de correo electrónico PHP para cuentas nuevas

En tutoriales anteriores, aprendió a crear un formulario de registro que permite a los usuarios registrarse para cuentas. Y también aprendió a crear un formulario de inicio de sesión que permitirá a los usuarios usar el nombre de usuario y la contraseña para iniciar sesión.

Cuando los usuarios se registran para nuevas cuentas, ingresan sus direcciones de correo electrónico. Sin embargo, los usuarios pueden ingresar cualquier dirección de correo electrónico porque el sistema no verifica el correo electrónico.

Para verificar las direcciones de correo electrónico de los usuarios, puede enviar un correo electrónico de verificación a estas direcciones de correo electrónico y solicitar a los usuarios que abran sus correos electrónicos y hagan clic en un enlace de activación.

Para hacerlo, siga los siguientes pasos cuando los usuarios registren cuentas:

  • Genere un código de activación único y establezca un tiempo de caducidad, por ejemplo, un día.
  • Guarde el registro de usuario en la base de datos y marque el estado del usuario como inactivo. Además, guarde el hash del código de activación & tiempo de caducidad.
  • Envíe un correo electrónico con el enlace de activación a la dirección de correo electrónico del usuario. El enlace de activación contendrá la dirección de correo electrónico y el código de activación, p. ej., https://app.com/activate.php?email=email&activation_code=abcd
  • Informar al usuario para activar la cuenta por correo electrónico.

El Hash del código de activación garantiza que solo el usuario que posee la dirección de correo electrónico pueda activar la cuenta, no cualquier otra persona, incluso el administrador, que pueda acceder a la base de datos.

Si los usuarios no han activado la cuenta, no podrán iniciar sesión.

Cuando los usuarios hacen clic en el enlace de activación en el correo electrónico, debe realizar los siguientes pasos:

  • Desinfecte y valide el correo electrónico y el código de activación.
  • Encuentra al usuario inactivo con la dirección de correo electrónico. Si no existe registro de usuario, redirija al formulario de registro.
  • Si existe un registro de usuario y el código de activación ha caducado, elimine el registro de usuario de la base de datos y redirija al formulario de registro.
  • De lo contrario, haga coincidir el código de activación con el hash del código de activación almacenado en la base de datos. Si coinciden, marque el registro de usuario como activo y redirija a la página de inicio de sesión.

Volver a crear la tabla de usuarios

Primero, elimine la tabla users de la base de datos auth :

Code language: SQL (Structured Query Language) (sql)

En segundo lugar, cree la tabla users con las nuevas columnas active, activation_code, activation_at, activation_expiry:

Code language: SQL (Structured Query Language) (sql)

A continuación se explica el significado de las nuevas columnas.

El valor predeterminado de la columna active es 0. Esto significa que los usuarios que se registren en cuentas pero no hayan verificado sus direcciones de correo electrónico estarán inactivos de forma predeterminada.

La columna activation_code almacenará el hash del código de activación. Su longitud debería ser suficiente para almacenar la cadena devuelta por la función password_hash().

Es importante notar que el hash se truncará si la columna activation_code no tiene un tamaño lo suficientemente largo. Hará que la función password_verify() no coincida con el código de activación con el hash.

La columna activation_expiry almacena el tiempo de caducidad para usar el código de activación antes de la caducidad. La hora de caducidad garantiza que el código de activación no se pueda usar si la dirección de correo electrónico se ve comprometida después de la hora de caducidad.

La columna activated_at almacena la fecha y hora en que los usuarios activan sus cuentas.

Estructura del proyecto

Revisemos la estructura actual del proyecto antes de agregar las funciones de verificación de correo electrónico:

Code language: PHP (php)

Modificar las funciones en auth.archivo php

Lo siguiente agrega el código de activación y el parámetro de caducidad a la función register_user(). De forma predeterminada, el tiempo de caducidad es de un día ( 1 * 24 * 60 * 60).

Code language: PHP (php)

La función register_user() utiliza la función password_hash() para hash el código de activación.

La función find_user_by_username() incluye la columna active en el resultado:

Code language: PHP (php)

Lo siguiente define una nueva función is_user_active() que devuelve true si un usuario está activo:

Code language: PHP (php)

La función login() debería permitir que solo los usuarios activos inicien sesión:

Code language: PHP (php)

Definir funciones que se ocupan de la verificación de correo electrónico

Agregaremos las funciones que se ocupan de la verificación de correo electrónico al archivo auth.php.

Primero, cree un nuevo archivo app.php en la carpeta config y defina las siguientes constantes:

Code language: PHP (php)

Usaremos estas constantes para enviar correos electrónicos de activación a los usuarios. Para usar estas constantes, debe incluir el archivo app.php en el archivo bootstrap.php :

Code language: PHP (php)

En segundo lugar, defina una función que genere un código de activación aleatorio único:

Code language: PHP (php)

En tercer lugar, defina una función que envíe una verificación de correo electrónico con un enlace de activación.

Code language: PHP (php)

Supongamos que la URL de la aplicación es http://localhost/auth, la URL de activación se verá así:

Code language: PHP (php)

La función send_activation_email() utiliza la función incorporada mail() para enviar correos electrónicos.

En cuarto lugar, defina una función que elimine un usuario por id y estado. De forma predeterminada, elimina un usuario inactivo por id.

Code language: PHP (php)

En quinto lugar, defina una función que encuentre un usuario no verificado mediante un correo electrónico y un código de activación. Si el código de activación ha caducado, la función también elimina el registro de usuario llamando a la función delete_user_by_id().

Code language: PHP (php)

Sexto, defina una nueva función activate_user() que active un usuario mediante un id:

Code language: PHP (php)

Modificar el registro.página php

El src/register.php necesita incorporar la lógica para manejar la lógica de verificación de correo electrónico.

Code language: PHP (php)

Cómo funciona.

Primero, genere un código de activación:

Code language: PHP (php)

En segundo lugar, registre al usuario con el código de activación:

Code language: PHP (php)

En tercer lugar, envíe un correo electrónico a la dirección de correo electrónico del usuario llamando a la función send_activation_email() :

Code language: PHP (php)

Finalmente, redirija al usuario a la página de inicio de sesión y muestre un mensaje flash que solicita al usuario que active la cuenta por correo electrónico:

Code language: PHP (php)

Crea el activador.página php

Para permitir a los usuarios activar sus cuentas después del registro, puede crear una nueva página activate.php en la carpeta public y usar la siguiente página:

Code language: PHP (php)

Cómo activar.php funciona.

Primero, desinfecte y valide el correo electrónico y el código de activación:

Code language: PHP (php)

En segundo lugar, busque al usuario no verificado en función del correo electrónico y el código de verificación si no hay errores de validación. El find_unverified_user() también eliminará al usuario no verificado si el tiempo de caducidad ha expirado.

Code language: PHP (php)

En tercer lugar, active el usuario y redirija al inicio de sesión.página php:

Code language: PHP (php)

Finalmente, redirija a registration.php si hay un error:

Code language: PHP (php)

En este tutorial, ha aprendido cómo implementar la verificación de correo electrónico para cuentas de usuario en PHP.

Leave a Reply