L'autenticació és un procés fonamental en el desenvolupament d'aplicacions web, ja que permet verificar la identitat dels usuaris que intenten accedir a un sistema. En aquest tema, explorarem els conceptes bàsics de l'autenticació, els diferents mètodes disponibles i com implementar-los en una aplicació Node.js.
Conceptes Clau
- Què és l'Autenticació?
L'autenticació és el procés de verificar la identitat d'un usuari. Això es fa normalment mitjançant credencials com un nom d'usuari i una contrasenya. Si les credencials són correctes, l'usuari és considerat autenticat i pot accedir a recursos protegits.
- Diferència entre Autenticació i Autorització
- Autenticació: Verifica la identitat de l'usuari.
- Autorització: Determina quins recursos pot accedir l'usuari autenticat.
- Mètodes d'Autenticació
- Autenticació Bàsica: Utilitza noms d'usuari i contrasenyes.
- Tokens JWT (JSON Web Tokens): Utilitza tokens per autenticar usuaris.
- OAuth: Un protocol d'autenticació que permet a les aplicacions accedir a recursos en nom de l'usuari.
- Autenticació de Doble Factor (2FA): Requereix dos factors per verificar la identitat de l'usuari.
Implementació Bàsica d'Autenticació en Node.js
- Instal·lació de Paquets Necessaris
Per començar, necessitarem alguns paquets per gestionar l'autenticació. Utilitzarem bcrypt
per encriptar contrasenyes i jsonwebtoken
per gestionar tokens JWT.
- Encriptació de Contrasenyes amb bcrypt
L'encriptació de contrasenyes és crucial per protegir les dades dels usuaris. A continuació, es mostra com encriptar una contrasenya i comparar-la durant el procés d'inici de sessió.
const bcrypt = require('bcrypt'); // Encriptar una contrasenya const saltRounds = 10; const plainPassword = 'mysecretpassword'; bcrypt.hash(plainPassword, saltRounds, (err, hash) => { if (err) throw err; console.log('Hashed Password:', hash); // Comparar la contrasenya durant l'inici de sessió bcrypt.compare(plainPassword, hash, (err, result) => { if (err) throw err; console.log('Password Match:', result); // true }); });
- Generació i Verificació de Tokens JWT
Els tokens JWT són una manera segura de gestionar sessions d'usuari. A continuació, es mostra com generar i verificar un token JWT.
const jwt = require('jsonwebtoken'); const user = { id: 1, username: 'user1' }; const secretKey = 'your_secret_key'; // Generar un token const token = jwt.sign(user, secretKey, { expiresIn: '1h' }); console.log('Generated Token:', token); // Verificar un token jwt.verify(token, secretKey, (err, decoded) => { if (err) throw err; console.log('Decoded Token:', decoded); });
- Exemple Complet: Autenticació Bàsica amb Node.js i Express
A continuació, es mostra un exemple complet d'una aplicació Express que implementa l'autenticació bàsica amb contrasenyes encriptades i tokens JWT.
const express = require('express'); const bcrypt = require('bcrypt'); const jwt = require('jsonwebtoken'); const app = express(); app.use(express.json()); const users = []; // Emmagatzema usuaris en memòria (només per a demostració) const secretKey = 'your_secret_key'; // Registre d'usuari app.post('/register', async (req, res) => { const { username, password } = req.body; const hashedPassword = await bcrypt.hash(password, 10); users.push({ username, password: hashedPassword }); res.status(201).send('User registered'); }); // Inici de sessió app.post('/login', async (req, res) => { const { username, password } = req.body; const user = users.find(u => u.username === username); if (user && await bcrypt.compare(password, user.password)) { const token = jwt.sign({ username: user.username }, secretKey, { expiresIn: '1h' }); res.json({ token }); } else { res.status(401).send('Invalid credentials'); } }); // Ruta protegida app.get('/protected', (req, res) => { const token = req.headers['authorization']; if (!token) return res.status(401).send('Access denied'); jwt.verify(token, secretKey, (err, decoded) => { if (err) return res.status(401).send('Invalid token'); res.send('Protected content'); }); }); app.listen(3000, () => { console.log('Server running on port 3000'); });
Exercicis Pràctics
Exercici 1: Encriptar i Comparar Contrasenyes
- Encripta una contrasenya utilitzant
bcrypt
. - Desa la contrasenya encriptada en una variable.
- Compara la contrasenya original amb la contrasenya encriptada per verificar si coincideixen.
Exercici 2: Generar i Verificar Tokens JWT
- Genera un token JWT per a un usuari fictici.
- Desa el token en una variable.
- Verifica el token per assegurar-te que és vàlid i extreu la informació de l'usuari.
Exercici 3: Implementar Autenticació en una Aplicació Express
- Crea una aplicació Express que permeti registrar usuaris amb contrasenyes encriptades.
- Implementa una ruta d'inici de sessió que generi un token JWT per a usuaris autenticats.
- Crea una ruta protegida que només sigui accessible per usuaris amb un token JWT vàlid.
Resum
En aquesta secció, hem après els conceptes bàsics de l'autenticació, incloent la diferència entre autenticació i autorització, i els diferents mètodes d'autenticació disponibles. Hem vist com encriptar contrasenyes amb bcrypt
i com generar i verificar tokens JWT. Finalment, hem implementat un exemple complet d'autenticació bàsica en una aplicació Node.js amb Express.
En el següent tema, explorarem com utilitzar Passport.js per gestionar l'autenticació en aplicacions Node.js de manera més robusta i flexible.
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