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
authenticateJWT
extreu el token de l'encapçalamentAuthorization
. - Verifiquem el token amb
jwt.verify()
. Si és vàlid, afegim la informació de l'usuari areq.user
i 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
/register
que acceptiusername
ipassword
. - Afegeix l'usuari a la llista
users
i 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
/profile
que només sigui accessible per usuaris autenticats. - Instruccions:
- Crea una nova ruta
/profile
que retorni la informació de l'usuari autenticat. - Utilitza el middleware
authenticateJWT
per 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