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

  1. Autenticació: L'usuari envia les seves credencials (normalment, nom d'usuari i contrasenya) al servidor.
  2. Generació del Token: Si les credencials són vàlides, el servidor genera un JWT i el retorna a l'usuari.
  3. Emmagatzematge del Token: L'usuari emmagatzema el token (normalment en localStorage o cookies).
  4. Autenticació de Peticions: Per a cada petició posterior, l'usuari envia el token al servidor.
  5. 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:

npm install jsonwebtoken express

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

  1. 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.
  2. Verificació del Token:

    • El middleware authenticateJWT extreu el token de l'encapçalament Authorization.
    • Verifiquem el token amb jwt.verify(). Si és vàlid, afegim la informació de l'usuari a req.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.

Exercicis Pràctics

Exercici 1: Generar i Verificar JWT

  1. Objectiu: Implementar una ruta de registre que generi un token JWT per a nous usuaris.
  2. Instruccions:
    • Crea una nova ruta /register que accepti username i password.
    • Afegeix l'usuari a la llista users i genera un token JWT.
    • Retorna el token a l'usuari.

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

  1. Objectiu: Protegir una nova ruta /profile que només sigui accessible per usuaris autenticats.
  2. Instruccions:
    • Crea una nova ruta /profile que retorni la informació de l'usuari autenticat.
    • Utilitza el middleware authenticateJWT per protegir la ruta.

Solució

app.get('/profile', authenticateJWT, (req, res) => {
  res.json({ user: req.user });
});

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

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats