Así que vamos a empezar a construir los sistemas de registro de usuarios más básicos en Node.js utilizando MongoDB como almacén de datos, Express como sistema de enrutamiento, Joi como validador y, por supuesto, Mongoose para facilitar la interacción con Mongo desde Node. A continuación tenemos nuestro diseño de proyecto de muestra. User-Registration es el directorio de nivel superior que contiene el archivo index.js, y luego tenemos un directorio de modelos y un directorio de rutas. Vamos a ver cómo construir los archivos JavaScript ahora para que esto funcione.
Paso 1. Cree un modelo de usuario
Primero, necesitamos crear un modelo de usuario . Puede crear un user.js
archivo y colocarlo en el models
directorio. En la parte superior del archivo, requerimos Joi y Mongoose, ya que los necesitaremos para la validación y para crear el esquema User Mongodb. Luego, creamos el esquema de usuario y definimos los requisitos de nombre, correo electrónico y contraseña. El esquema de usuario se almacena en User
. A continuación, creamos una función de validación llamada validateUser
. Por último, exportamos estos módulos para poder requerirlos en otro lugar.
/models/user.js
Paso 2. Configurar rutas de usuarios
Ahora que tenemos un modelo de usuario configurado que define el esquema que debemos seguir y las reglas de validación, podemos crear un users.js
archivo de rutas en nuestro routes
directorio. En este archivo, lo primero que hacemos en la parte superior es solicitar, o importar, el esquema de usuario y validar el esquema que acabamos de exportar en user.js. A continuación, nos aseguramos de que Express esté inicializado. La función router.post () hace todo el trabajo pesado aquí. Primero se valida la solicitud de publicación http, luego verificamos si el usuario ya existe en la base de datos, y finalmente creamos un nuevo usuario si no existe en la base de datos y también si pasa todos los requisitos de validación. Por último exportamos el enrutador, para que podamos usarlo en el archivo index.js.
/routes/users.js
Paso 3. Registrar la ruta de los usuarios en index.js
index.js
La mayor parte del texto estándar aquí debería resultarle familiar si ya siguió el tutorial de la API de resto. Aquí se destacan los puntos clave de este tutorial. Tenga en cuenta que necesitamos el archivo users.js en la línea 4. Esto nos permite configurar la ruta para la /api/users
línea 13.
Paso 4. Pruebe las solicitudes de publicación con Postman
Ahora podemos hacer uso de Postman para enviar una solicitud de publicación a nuestro servidor para ver si podemos persistir un nuevo usuario en MongoDB. Primero, iniciemos la aplicación.
registro de usuario $ node index.js Escuchando en el puerto 4000 ... ¡Ahora conectado a MongoDB!
¡Impresionante, todo está funcionando sin fallas! Ahora podemos probar algunas solicitudes de publicación. Aquí enviamos una solicitud de publicación como application / json con un objeto json en el cuerpo de la solicitud. Solo configuramos el nombre de usuario, pero dejamos tanto el correo electrónico como la contraseña. Podemos ver que nuestra validación está funcionando ya que la respuesta que obtenemos del servidor es "correo electrónico".
Ahora completemos un objeto de usuario adecuado para ver si podemos hacer que el usuario se almacene en la base de datos de MongoDB. Esta vez, no obtenemos un error, pero vemos el objeto de usuario. ¡Esto significa que tuvo éxito!
Ahora podemos mirar dentro de MongoDB usando Compass y ver si este nuevo usuario está en su lugar. ¡Agradable!
Recuerde que pusimos algo de lógica en el código para asegurarnos de que si ya había un usuario en la base de datos, entonces no deberíamos mantener ese usuario nuevamente. Para probar esto, enviamos esa misma solicitud nuevamente al servidor y obtenemos la respuesta que esperamos. No podemos insertar el mismo usuario dos veces. ¡Muy agradable!
Hash de contraseñas con Bcrypt
La parte rudimentaria del registro de usuario ahora funciona, sin embargo, la contraseña está en texto sin cifrar. Este es un gran no, no, así que veamos cómo encriptar la contraseña antes de guardarla en la base de datos usando el paquete bcrypt. Primero, lo instalamos.
registro de usuario $ npm i bcrypt > bcrypt@2.0.1 instalar C: nodeuser-registrationnode_modulesbcrypt > instalación de node-pre-gyp --fallback-to-build [bcrypt] Éxito: "C: nodeuser-registrationnode_modulesbcryptlibbindingbcrypt_lib.node" se instala de forma remota + bcrypt@2.0.1 agregó 69 paquetes de 47 contribuyentes y auditó 247 paquetes en 8.548s encontró 1 vulnerabilidad de gravedad baja correnpm audit fix
para arreglarlos, onpm audit
para detalles
Ahora que tenemos bcrypt instalado, podemos usarlo en el archivo de rutas users.js así. En la parte superior del archivo, ahora necesitamos el paquete bcrypt que lo hace disponible para usar más abajo en el archivo. En las líneas 24 y 25 generamos una sal y la usamos para codificar la contraseña antes de guardar.
/routes/users.js
Ahora, ejecutemos la aplicación y luego probemos con Postman.
registro de usuario $ node index.js Escuchando en el puerto 4000 ... ¡Ahora conectado a MongoDB!
Con eso, podemos abrir Postman y enviar una solicitud POST a http: // localhost: 4000 / api / users / con un nuevo usuario especificado como un objeto JSON en el cuerpo de la solicitud.
¡Excelente! Obtenemos un objeto de respuesta que significa que se creó un nuevo usuario y notamos el campo de contraseña: está completamente hash. De esta manera, la contraseña está segura en la base de datos de Mongo. De hecho, inspeccionémoslo también con Compass. Tenga en cuenta que el primer usuario que hemos creado tiene una contraseña almacenada en texto sin formato. El nuevo usuario tiene una contraseña mucho más segura que está correctamente cifrada con bcrypt.
Usar Lodash para simplificar nuestro código
Vamos a importar el paquete lodash a nuestro proyecto para que podamos usarlo. Lodash es una poderosa biblioteca de utilidades de JavaScript similar a la popular Biblioteca de subrayado. Aquí continuamos e instalamos Lodash.
registro de usuario $ npm i lodash + lodash@4.17.10 actualizó 1 paquete y auditó 247 paquetes en 13.631 y encontró 1 vulnerabilidad de baja gravedad correnpm audit fix
para arreglarlos, onpm audit
para detalles
¡Excelente! Ahora podemos usar lodash en nuestro proyecto. Específicamente en este caso vamos a utilizar la función de selección que hace que trabajar con objetos sea más conciso. Ahora, una vez que importamos lodash a nuestro archivo, podemos hacer uso de estos prácticos liners resaltados aquí.
Cómo autenticar usuarios
Ahora que el registro de usuario está en su lugar, podemos configurar el proceso de autenticación de usuarios. Primero, siga adelante y cree un archivo auth.js en el directorio de rutas. Una vez completado, podemos comenzar con este texto estándar.
/routes/auth.js
Ahora tenemos que volver al archivo index.js y configurar la ruta para 'api / auth' así.
Ok, volvamos al archivo auth.js. Aquí necesitamos configurar la lógica que autenticará a un usuario cuando se proporcionen las credenciales durante un intento de inicio de sesión. Eso significa que necesitamos validar la solicitud HTTP que se envía, encontrar al usuario en la base de datos y luego usar bcrypt para comparar la contraseña almacenada con la contraseña proporcionada en la solicitud. Este código logrará esos objetivos.
/routes/auth.js
¡Excelente! Ahora probemos el punto final de autenticación usando Postman. Podemos proporcionar un correo electrónico y una contraseña válidos y ver qué sucede.
Ahora enviemos una solicitud con la contraseña incorrecta y veamos el resultado. ¡Ah, ja, se ve bien! Está detectando la contraseña incorrecta, por lo que el usuario no puede autenticarse.
Implementación de tokens web JSON
En la sección anterior, simplemente devolvimos un true
valor cuando se realizó un intento de inicio de sesión exitoso. Ahora vamos a modificar esta respuesta para enviar un token web JSON, que puede identificar de forma única a cualquier usuario en el sistema. Entonces, en general, la forma en que funciona es que la API genera un JSON Web Token al iniciar sesión correctamente y luego, en el futuro, ese usuario debe proporcionar el JSON Web Token para identificarse como un usuario válido al realizar varias solicitudes http a la API. En el lado del cliente, este token podría almacenarse en el almacenamiento local. Eso está más allá del alcance de este tutorial, ya que aquí nos centraremos en el lado del servidor. De acuerdo, para comenzar a generar JSON Web Tokens, necesitamos instalar un paquete npm para manejar eso por nosotros.
registro de usuario $ npm i jsonwebtoken + jsonwebtoken@8.3.0 agregó 13 paquetes de 9 contribuyentes y auditó 263 paquetes en 4.659 y encontró 1 vulnerabilidad de baja gravedad correnpm audit fix
para arreglarlos, onpm audit
para detalles
Aquí modificamos el archivo auth.js para hacer uso del paquete jsonwebtoken. También lo usamos para generar un nuevo JSON Web Token, y lo enviamos como respuesta a una solicitud http adecuada.
¡Fantástico! Probemos el envío de un nombre de usuario y un correo electrónico válidos como una solicitud POST a nuestro punto final / api / auth. Vemos que se nos devuelve un JSON Web Token válido.
Realmente no deberíamos hacer que PrivateKey sea parte del código fuente, debería estar en una variable de entorno de algún tipo. Hagamos esto ahora. Primero podemos instalar el paquete de configuración.
registro de usuario $ npm i config + config@1.30.0 Se agregaron 3 paquetes de 5 colaboradores y se auditaron 266 paquetes en 5.314 y se encontró 1 vulnerabilidad de baja gravedad. correnpm audit fix
para arreglarlos, onpm audit
para detalles
Una vez instalado, podemos solicitarlo en el archivo auth.js.
Ahora creemos una carpeta de configuración en nuestro proyecto y coloquemos un archivo default.json y un archivo custom-environment-variables.json allí.
default.json
variables de entorno personalizadas.json
Ahora, en lugar de hacer referencia a la clave privada directamente, hacemos referencia a ella usando la función config.get () como vemos aquí.
También deberíamos incluir esto en index.js así.