Una de las partes más importantes de cualquier aplicación es la seguridad y la forma en que manejamos la autenticación y la autorización. Esto es especialmente cierto cuando se crean API, donde debemos asegurarnos de que solo los usuarios autenticados y autorizados puedan acceder a ciertos datos y funciones. En este capítulo, exploraremos cómo crear una API REST básica con NodeJS y ExpressJS, centrándonos en la autenticación y la autorización.
Autenticación
La autenticación es el proceso de verificar la identidad de un usuario. En otras palabras, así es como confirmamos que un usuario es quien dice ser. Hay varias formas de hacerlo, pero una de las más comunes es mediante el uso de nombres de usuario y contraseñas.
Para implementar la autenticación en nuestra API, primero necesitamos instalar algunas dependencias. Usaremos el paquete 'bcrypt' para codificar las contraseñas de los usuarios y el paquete 'jsonwebtoken' para generar tokens de autenticación.
$ npm instala bcrypt jsonwebtoken
Con las dependencias instaladas, podemos comenzar a implementar la autenticación. Primero, creemos una ruta para el registro de usuarios. En esta ruta, aplicaremos hash a la contraseña del usuario antes de almacenarla en la base de datos.
const expresar = requerir('expresar'); const bcrypt = requerir('bcrypt'); const Usuario = require('../modelos/Usuario'); enrutador constante = express.Router(); router.post('/registro', async (req, res) => { const hashedPassword = await bcrypt.hash(req.body.password, 10); usuario const = nuevo usuario ({ nombre de usuario: req.body.nombre de usuario, contraseña: hashPassword }); esperar usuario.save(); res.status(201).send({ mensaje: 'Usuario registrado correctamente' }); });
Ahora, creemos una ruta para que los usuarios inicien sesión. En esta ruta vamos a comprobar si la contraseña proporcionada coincide con la contraseña almacenada en la base de datos. Si la contraseña es correcta, generaremos un token de autenticación y se lo enviaremos al usuario.
const jwt = require('jsonwebtoken'); router.post('/iniciar sesión', async (req, res) => { usuario constante = await User.findOne({ nombre de usuario: req.body.nombre de usuario }); if (!usuario || !await bcrypt.compare(req.body.contraseña, usuario.contraseña)) { return res.status(401).send({ mensaje: 'Nombre de usuario o contraseña no válidos' }); } token const = jwt.sign({ id: usuario._id }, 'your_jwt_secret'); res.enviar({ token }); });
Autorización
La autorización es el proceso de verificar que un usuario tiene permiso para realizar una acción específica. En otras palabras, así es como determinamos lo que un usuario puede y no puede hacer. Hay varias formas de hacerlo, pero una de las más comunes es mediante el uso de tokens de autenticación.
Creemos un middleware para verificar el token de autenticación del usuario. Si el token es válido, almacenaremos el ID de usuario en el objeto de solicitud y llamaremos a la siguiente función. Si el token no es válido, devolveremos una respuesta con el estado 401 (no autorizado).
const jwt = require('jsonwebtoken'); autenticar const = (req, res, siguiente) => { token constante = req.headers.authorization; si (!token) { return res.status(401).send({ mensaje: 'No se proporcionó token' }); } jwt.verify(token, 'your_jwt_secret', (err, decodificado) => { si (errar) { return res.status(401).send({ mensaje: 'Token no válido' }); } req.userId = decodificado.id; próximo(); }); };
Ahora podemos utilizar este middleware en cualquier ruta que requiera autenticación. Por ejemplo, podemos crear una ruta para obtener detalles del usuario autenticado.
router.get('/yo', autenticar, async (req, res) => { usuario constante = espera User.findById(req.userId); res.enviar(usuario); });
Con eso, hemos completado la creación de una API REST básica con NodeJS y ExpressJS, con autenticación y autorización. Recuerde, la seguridad es un aspecto crucial de cualquier aplicación y debe tomarse en serio desde el principio del desarrollo.