Introducció
En aquest tema, explorarem els conceptes d'autenticació i autorització en el context dels microserveis. Aquests dos aspectes són fonamentals per garantir la seguretat de les aplicacions distribuïdes. Aprendrem sobre els diferents mètodes d'autenticació, com gestionar les identitats dels usuaris i com assegurar que només els usuaris autoritzats puguin accedir a certs recursos.
Conceptes Bàsics
Autenticació
L'autenticació és el procés de verificar la identitat d'un usuari o sistema. En altres paraules, és el procés de confirmar que algú és qui diu ser. Alguns dels mètodes comuns d'autenticació inclouen:
- Autenticació basada en contrasenya: L'usuari proporciona un nom d'usuari i una contrasenya.
- Autenticació de dos factors (2FA): A més de la contrasenya, es requereix un segon factor, com un codi enviat al telèfon mòbil.
- Autenticació basada en certificats: Utilitza certificats digitals per verificar la identitat.
- OAuth: Un protocol que permet a les aplicacions obtenir accés limitat als comptes d'usuari en un servei HTTP.
Autorització
L'autorització és el procés de determinar si un usuari autenticat té permís per accedir a un recurs específic o realitzar una acció determinada. Els mètodes comuns d'autorització inclouen:
- Llistes de control d'accés (ACL): Defineixen quins usuaris o grups d'usuaris tenen permís per accedir a certs recursos.
- Roles-Based Access Control (RBAC): Assigna permisos a rols específics, i els usuaris són assignats a aquests rols.
- Attribute-Based Access Control (ABAC): Utilitza atributs dels usuaris, recursos i entorn per determinar els permisos.
Implementació en Microserveis
Autenticació en Microserveis
En una arquitectura de microserveis, l'autenticació pot ser gestionada de diverses maneres. Una de les més comunes és utilitzar un servei d'autenticació centralitzat. Aquest servei pot emetre tokens d'autenticació que els altres microserveis poden verificar. Alguns dels enfocaments inclouen:
- JSON Web Tokens (JWT): Els tokens JWT són àmpliament utilitzats per a l'autenticació en microserveis. Són segurs, fàcils de verificar i poden contenir informació addicional sobre l'usuari.
- OAuth 2.0: OAuth 2.0 és un protocol d'autorització que permet a les aplicacions obtenir accés limitat als comptes d'usuari en un servei HTTP.
Exemple de JWT
import jwt import datetime # Generar un token JWT def generar_token(usuario_id): payload = { 'usuario_id': usuario_id, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) } token = jwt.encode(payload, 'secret_key', algorithm='HS256') return token # Verificar un token JWT def verificar_token(token): try: payload = jwt.decode(token, 'secret_key', algorithms=['HS256']) return payload['usuario_id'] except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None
Autorització en Microserveis
L'autorització en microserveis pot ser gestionada de manera descentralitzada. Cada microservei pot tenir la seva pròpia lògica d'autorització, o es pot utilitzar un servei centralitzat per gestionar els permisos. Alguns enfocaments inclouen:
- RBAC: Assignar rols als usuaris i definir permisos per a cada rol.
- ABAC: Utilitzar atributs per determinar els permisos.
Exemple de RBAC
# Definir rols i permisos roles_permisos = { 'admin': ['crear', 'llegir', 'actualitzar', 'eliminar'], 'usuari': ['llegir'] } # Verificar permisos def verificar_permis(usuario_rol, permis): if permis in roles_permisos.get(usuario_rol, []): return True return False # Exemple d'ús usuario_rol = 'admin' permis = 'crear' if verificar_permis(usuario_rol, permis): print("Permís concedit") else: print("Permís denegat")
Exercicis Pràctics
Exercici 1: Implementar Autenticació amb JWT
- Implementa una funció per generar tokens JWT per a usuaris autenticats.
- Implementa una funció per verificar tokens JWT i extreure la informació de l'usuari.
Exercici 2: Implementar Autorització amb RBAC
- Defineix rols i permisos per a una aplicació fictícia.
- Implementa una funció per verificar si un usuari amb un rol específic té permís per realitzar una acció determinada.
Solucions
Solució Exercici 1
import jwt import datetime def generar_token(usuario_id): payload = { 'usuario_id': usuario_id, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) } token = jwt.encode(payload, 'secret_key', algorithm='HS256') return token def verificar_token(token): try: payload = jwt.decode(token, 'secret_key', algorithms=['HS256']) return payload['usuario_id'] except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None
Solució Exercici 2
roles_permisos = { 'admin': ['crear', 'llegir', 'actualitzar', 'eliminar'], 'usuari': ['llegir'] } def verificar_permis(usuario_rol, permis): if permis in roles_permisos.get(usuario_rol, []): return True return False # Exemple d'ús usuario_rol = 'admin' permis = 'crear' if verificar_permis(usuario_rol, permis): print("Permís concedit") else: print("Permís denegat")
Conclusió
En aquesta secció, hem après sobre els conceptes d'autenticació i autorització, així com les seves implementacions en una arquitectura de microserveis. Hem vist exemples pràctics d'ús de JWT per a l'autenticació i RBAC per a l'autorització. Aquests conceptes són fonamentals per garantir la seguretat de les aplicacions distribuïdes i assegurar que només els usuaris autoritzats puguin accedir als recursos adequats.
Curs de Microserveis
Mòdul 1: Introducció als Microserveis
- Conceptes Bàsics de Microserveis
- Avantatges i Desavantatges dels Microserveis
- Comparació amb Arquitectura Monolítica
Mòdul 2: Disseny de Microserveis
- Principis de Disseny de Microserveis
- Descomposició d'Aplicacions Monolítiques
- Definició de Bounded Contexts