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

  1. 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.

  1. Diferència entre Autenticació i Autorització

  • Autenticació: Verifica la identitat de l'usuari.
  • Autorització: Determina quins recursos pot accedir l'usuari autenticat.

  1. 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

  1. 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.

npm install bcrypt jsonwebtoken

  1. 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
  });
});

  1. 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);
});

  1. 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

  1. Encripta una contrasenya utilitzant bcrypt.
  2. Desa la contrasenya encriptada en una variable.
  3. Compara la contrasenya original amb la contrasenya encriptada per verificar si coincideixen.

Exercici 2: Generar i Verificar Tokens JWT

  1. Genera un token JWT per a un usuari fictici.
  2. Desa el token en una variable.
  3. 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

  1. Crea una aplicació Express que permeti registrar usuaris amb contrasenyes encriptades.
  2. Implementa una ruta d'inici de sessió que generi un token JWT per a usuaris autenticats.
  3. 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

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