La autenticación de usuario es el proceso de verificar la identidad de un usuario que intenta obtener acceso a su aplicación. Implica autorizar y transferir credenciales para confirmar la autenticidad de un usuario.
Puede implementar un modelo de autenticación de usuario simple en Node.js usando Express, Bcrypt y MongoDB, en solo unos pocos pasos.
Paso 1: Configuración del entorno de desarrollo
Primero, cree una carpeta de proyecto y discos compactos en él ejecutando:
mkdir autenticación de usuario
discos compactos autenticacion de usuario
A continuación, inicialice npm en el directorio de su proyecto ejecutando:
npm inicializar -y
los -y flag inicializa npm y crea su paquete.json archivo con todos sus valores predeterminados.
Este modelo de autenticación de usuario requiere algunas dependencias.
Incluyen:
- Expresar: Express es un marco Node.js que proporciona un conjunto sólido de funciones para aplicaciones web y móviles. Facilita la creación de aplicaciones de back-end con Node.js.
- Bcrypt: bcrypt es un paquete npm que implementa la función de hashing de contraseñas de bcrypt. Le permite crear hashes a partir de cadenas de contraseñas simples.
- Mongoose: Mongoose es una biblioteca de modelado de datos de objetos de MongoDB. Simplifica las interacciones entre su aplicación y una base de datos MongoDB.
- dotenv: dotenv es un paquete de dependencia cero que carga variables de entorno desde un .env archivo en proceso.env.
- Validador: el validador es un paquete que contiene varias funciones de validación de cadenas.
- Body-parser: el paquete body-parser analiza los cuerpos de solicitud en un middleware antes que sus controladores.
Instale los paquetes ejecutando:
npm Instalar en pc express bcrypt mongoose dotenv validador cuerpo-analizador
A continuación, cree un aplicación.js archivo en el directorio raíz de su proyecto y agregue el bloque de código a continuación para crear un servidor Express básico:
// aplicación.js
constante expresar = requerir('Rápido');
constante aplicación = expreso();
constante analizador de cuerpo = requerir("analizador de cuerpo");constante puerto = 3000;
aplicaciónusar(analizador de cuerpo.json());
aplicación.usar(analizador de cuerpo.urlencodificado({ extendido: verdadero }));
app.listen (puerto, ()=>{
consola.Iniciar sesión(`La aplicación está escuchando en el puerto ${puerto}`);
});
Este código crea una instancia de aplicación express llamando a la función express. Luego usa el analizador de cuerpo middleware para analizar los cuerpos de solicitud entrantes. Luego comienza a escuchar el tráfico en el puerto 3000 llamando al método de escucha de la instancia express y pasando la variable del puerto como argumento.
Paso 2: Conexión de su aplicación a una base de datos
En el directorio raíz de su proyecto, cree un .env archivo y almacene sus credenciales de MongoDB en él. Esto evita exponer las credenciales de su base de datos en un código que puede dar acceso a su base de datos a usuarios malintencionados.
A continuación, navegue hasta su aplicación.js archivar e importar mangosta:
constante mangosta = requerir("mangosta");
Luego, llame a importar dotenv y llama al configuración método en él:
requerir("dotenv").config();
llamando al configuración método en dotenv carga variables ambientales en el proceso.env.
Finalmente, llame al método de conexión en mangosta y pase su MongoDB URI como argumento:
mangosta.conectar (proceso.env. MONGODB_URI).entonces(() => {
consola.log('Conectado a la base de datos con éxito')
})
Paso 3: Creación del modelo de usuario
En el directorio raíz de su proyecto, cree un "modelos” carpeta; aquí es donde almacenará su modelo de mangosta:
mkdir modelos
A continuación, cree un "modelo de usuario” y agregue las siguientes importaciones:
constante mangosta = requerir('mangosta')
constante { esCorreo electrónico } = requerir('validador')
esCorreo electrónico es una función de validación que devuelve verdadero si una cadena dada es un correo electrónico. Lo necesitará para aplicar la validación de mongoose a su modelo de usuario.
A continuación, agregue el siguiente código a su modelo de usuario expediente:
// modelos/modelo de usuario
constante esquema de usuario = mangosta. Esquema({
Email: {
escribe: Cuerda,
requerido: [verdadero, 'correo electronico es requerido'],
validar: {
validador: isEmail,
mensaje: accesorios => `${props.value} no es un correo electrónico válido`
}
},clave: {
escribe: Cuerda,
requerido: [verdadero, 'se requiere contraseña'],
validar: {
validador: función (valor) {
devolver valor.longitud >= 6
},
mensaje: () =>'La contraseña debe tener al menos seis caracteres'
}
}
})
módulo.exportaciones = mongoose.model('Usuario', userSchema)
El código anterior crea un esquema de usuario variable que almacena el valor de la mangosta. Esquema método. la mangosta El método Schema asigna propiedades a una colección MongoDB y define la forma de los documentos dentro de ella. El esquema de la mangosta tiene dos propiedades: una Email y un clave—cuáles serán sus requisitos de autenticación.
La propiedad de correo electrónico es un tipo de cadena y tiene requerido establecido en verdadero. El mensaje de error adjunto, "Se requiere correo electrónico", se mostrará si el cuerpo de una solicitud no contiene un Email propiedad. Finalmente, usando la validación personalizada de mongoose, el validador la propiedad se refiere a la esCorreo electrónico función. Esa función devuelve verdadero o falso según la validez de la cadena como un correo electrónico. Luego, la propiedad del mensaje toma el valor del correo electrónico (accesorios) y construye un mensaje de error significativo.
La propiedad de contraseña es un tipo de cadena obligatorio con un mensaje de error que dice "Se requiere contraseña". los validador La función es anónima y devuelve verdadero si la contraseña tiene al menos seis caracteres.
La línea final crea y exporta un modelo de mangosta llamando al modelo método en mangosta. Pase el nombre del modelo (Usuario) como primer argumento y un esquema (esquema de usuario) como segundo argumento.
Paso 4: Implementación de rutas de inicio de sesión y registro
En el directorio raíz de su proyecto, cree un rutas carpeta:
rutas mkdir
En su carpeta de rutas, cree un UserRoutes.js archivo y agregue las siguientes importaciones:
// rutas/rutas de usuario.js
constante expresar = requerir("Rápido");
constante Usuario = requerir(../modelos/modelo de usuario");
constante bcripta = requerir("bcripta");
Cree una instancia de Express Router llamando al enrutador método en Rápido:
constante enrutador = expreso. enrutador();
A continuación, cree su ruta de registro agregando el bloque de código a continuación a su rutausuario.js expediente:
enrutador.post("/sign-up", asíncrono (requerido, res) => {
probar {
// Extrae el correo electrónico y la contraseña del objeto req.body
constante { correo electrónico, contraseña } = req.body;// Controlarsi el correo electrónico es ya enusar
dejar el usuario existe = esperar Usuario.findOne({correo electrónico});si (el usuario existe) {
res.status(401).json({ mensaje: "El correo electrónico ya está en usar.&citar; });
devolver;
}// Definir rondas de sal
constante rondas de sal = 10;// Contraseña hash
bcrypt.hash (contraseña, saltRounds, (err, hash) => {
si (errar) lanzarnuevoError("Servidor interno Error");// Crear a nuevousuario
dejar usuario = nuevo Usuario({
Email,
clave: picadillo,
});
// Guardar usuario en la base de datos
usuario.guardar().entonces(() => {
res.json({mensaje: "Usuario creado con éxito", usuario });
});
});
} captura (Error) {
devolverresolución.estado(401).enviar(errar.mensaje);
}
});
En el bloque de código anterior, primero, desestructuraste el correo electrónico y la contraseña del req.cuerpo objeto. Luego, verifique si un usuario ya está usando el correo electrónico porque debe ser único para cada usuario. Si el correo electrónico ya se ha utilizado, regresa y detiene la ejecución del código con un código de estado 401.
El almacenamiento de contraseñas simples en una base de datos es una gran amenaza para la seguridad, ya que los piratas informáticos malintencionados pueden acceder a la base de datos. Debe codificar las contraseñas antes de almacenarlas en su base de datos, por lo que incluso si un pirata informático las descubre, no debería haber ningún riesgo para los usuarios. Hashing es el proceso de convertir una "clave" dada en otro valor. Hashing es una función unidireccional, lo que significa que no puede recuperar el valor original del hash, a diferencia del cifrado.
Usando bcrypt, has hash su contraseña de usuario llamando al método hash en bcrypt. El método hash toma tres parámetros: la cadena que se va a codificar, rondas de sal y una función de devolución de llamada. Pasa la contraseña de usuario, la variable saltRounds que creó anteriormente y una devolución de llamada.
Las rondas de sal se refieren al tiempo necesario para calcular un solo hash bcrypt. Cuanto más altas sean las rondas de sal, más rondas de hashing.
Si el método hash arroja un error, arroja un "error de servidor interno". De lo contrario, establece la propiedad de la contraseña en el hash exitoso y la guarda en su base de datos llamando al método de guardado en el Usuario instancia.
A continuación, cree su ruta de inicio de sesión agregando el bloque de código a continuación a su rutausuario.js expediente:
enrutador.post("/sign-in", asíncrono (requerido, res) => {
probar {
// Extrae el correo electrónico y la contraseña del objeto req.body
constante { correo electrónico, contraseña } = req.body;// Controlarsiusuarioexisteenbase de datos
dejar usuario = esperar Usuario.findOne({correo electrónico});si (!usuario) {
devuelve res.status (401).json({mensaje: "Credenciales no válidas" });
}// Comparar contraseñas
bcrypt.compare (contraseña, usuario.contraseña, (err, resultado) => {
si (resultado) {
devuelve res.status (200).json({mensaje: "Usuario iniciado sesión con éxito" });
}consola.log (error);
devuelve res.status (401).json({mensaje: "Credenciales no válidas" });
});
} captura (error) {
resolución.estado(401).enviar(errar.mensaje);
}
});
módulo.exportaciones = enrutador;
En el bloque de código anterior, primero, desestructura el correo electrónico y la contraseña del req.cuerpo objeto. Luego, verifica si existe un usuario en su base de datos. Si el usuario no existe en su base de datos, regresa con un código de estado 401.
Luego, utilizando el método de comparación de bcrypt, ingrese la contraseña que proporcionó el usuario y la contraseña cifrada que recuperó de su base de datos. Compara los dos para confirmar si coinciden. Si las contraseñas coinciden, devuelve un código de estado 200 y un mensaje de éxito. De lo contrario, devuelve un código de estado 401 y un mensaje de error.
Finalmente, importa enrutador en tu aplicación.js y utilícelo como un middleware a nivel de aplicación.
Esto completa su modelo de autenticación de usuario; ahora, los usuarios pueden registrarse de forma segura e iniciar sesión en su aplicación.
La importancia de la autenticación de usuario
La autenticación de usuario garantiza que solo los usuarios legítimos puedan acceder a su aplicación. Si sus datos son de alguna manera personales o privados, debe tomar medidas para evitar que los usuarios no autenticados obtengan acceso.