Introducció
L'autenticació basada en JSON Web Tokens (JWT) és una tècnica popular per autenticar usuaris en aplicacions web modernes. Els JWT són tokens compactes, auto-contenidors i segurs que es poden utilitzar per verificar la identitat dels usuaris i compartir informació entre diferents parts d'una aplicació.
Conceptes Clau
- JWT (JSON Web Token): Un estàndard obert (RFC 7519) que defineix una manera compacta i autònoma per a la transmissió segura d'informació entre les parts com un objecte JSON.
- Header: Conté informació sobre el tipus de token i l'algoritme de signatura utilitzat.
- Payload: Conté les reclamacions (claims), que són declaracions sobre una entitat (normalment, l'usuari) i dades addicionals.
- Signature: Utilitzada per verificar que el missatge no ha estat alterat.
Com Funciona JWT
- Autenticació: L'usuari envia les seves credencials (normalment, nom d'usuari i contrasenya) al servidor.
- Generació del Token: Si les credencials són vàlides, el servidor genera un JWT i el retorna a l'usuari.
- Emmagatzematge del Token: L'usuari emmagatzema el token (normalment en localStorage o cookies).
- Autenticació de Peticions: Per a cada petició posterior, l'usuari envia el token al servidor.
- Verificació del Token: El servidor verifica el token i, si és vàlid, processa la petició.
Implementació Pràctica
Instal·lació de Dependències
Per començar, necessitem instal·lar alguns paquets npm:
Generació del JWT
Primer, crearem una ruta d'autenticació que generi un token JWT quan l'usuari es logueja correctament.
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const users = [
{ id: 1, username: 'user1', password: 'password1' },
{ id: 2, username: 'user2', password: 'password2' }
];
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
const token = jwt.sign({ id: user.id, username: user.username }, 'secretKey', { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).send('Invalid credentials');
}
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});Verificació del JWT
Ara, crearem un middleware per verificar el token en les peticions protegides.
const authenticateJWT = (req, res, next) => {
const token = req.header('Authorization')?.split(' ')[1];
if (token) {
jwt.verify(token, 'secretKey', (err, user) => {
if (err) {
return res.sendStatus(403);
}
req.user = user;
next();
});
} else {
res.sendStatus(401);
}
};
app.get('/protected', authenticateJWT, (req, res) => {
res.send('This is a protected route');
});Explicació del Codi
-
Generació del Token:
- Quan l'usuari envia les seves credencials a
/login, busquem l'usuari en la nostra base de dades simulada. - Si l'usuari és trobat, generem un token JWT amb
jwt.sign(), utilitzant una clau secreta (secretKey) i establint una caducitat d'1 hora. - Retornem el token a l'usuari.
- Quan l'usuari envia les seves credencials a
-
Verificació del Token:
- El middleware
authenticateJWTextreu el token de l'encapçalamentAuthorization. - Verifiquem el token amb
jwt.verify(). Si és vàlid, afegim la informació de l'usuari areq.useri continuem amb la següent funció middleware. - Si el token no és vàlid o no està present, retornem un codi d'estat 401 o 403.
- El middleware
Exercicis Pràctics
Exercici 1: Generar i Verificar JWT
- Objectiu: Implementar una ruta de registre que generi un token JWT per a nous usuaris.
- Instruccions:
- Crea una nova ruta
/registerque acceptiusernameipassword. - Afegeix l'usuari a la llista
usersi genera un token JWT. - Retorna el token a l'usuari.
- Crea una nova ruta
Solució
app.post('/register', (req, res) => {
const { username, password } = req.body;
const newUser = { id: users.length + 1, username, password };
users.push(newUser);
const token = jwt.sign({ id: newUser.id, username: newUser.username }, 'secretKey', { expiresIn: '1h' });
res.json({ token });
});Exercici 2: Protegir Rutes Addicionals
- Objectiu: Protegir una nova ruta
/profileque només sigui accessible per usuaris autenticats. - Instruccions:
- Crea una nova ruta
/profileque retorni la informació de l'usuari autenticat. - Utilitza el middleware
authenticateJWTper protegir la ruta.
- Crea una nova ruta
Solució
Errors Comuns i Consells
- Clau Secreta: Assegura't de mantenir la clau secreta segura i no la comparteixis públicament.
- Caducitat del Token: Estableix una caducitat adequada per als tokens per millorar la seguretat.
- Emmagatzematge del Token: Emmagatzema els tokens de manera segura en el client (per exemple, en cookies segures).
Conclusió
L'autenticació JWT és una tècnica poderosa i flexible per gestionar la seguretat en aplicacions web. Amb els coneixements adquirits en aquesta secció, ara pots implementar autenticació basada en tokens en les teves aplicacions Node.js, millorant la seguretat i l'experiència de l'usuari.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu
