Un microservicio completo de identidades digitales que implementa autenticación JWT, gestión de usuarios SCIM 2.0, y autorización basada en atributos (ABAC).
El microservicio implementa los siguientes flujos principales:
- 🔐 Autenticación JWT: Generación y validación de tokens seguros
- 🛡️ Autorización ABAC: Evaluación de políticas basada en atributos
- 👥 Gestión SCIM: Administración de usuarios y grupos según estándar SCIM 2.0
- 📊 Monitoreo: Health checks
Para facilitar las pruebas, se incluyen colecciones de Postman organizadas por módulo:
- Auth - Autenticación y gestión de tokens JWT
- Authz - Evaluación de políticas ABAC y autorización
- SCIM Users - Gestión de usuarios según estándar SCIM 2.0
- SCIM Groups - Administración de grupos y membresías
Para documentación detallada de cada endpoint, consultar request_documentation.md.
- JWT Tokens con soporte OAuth2/OIDC-like
- ABAC (Attribute-Based Access Control) con motor de políticas configurable
- Rate limiting por endpoint
- Middleware de autenticación automático
- Usuarios: Crear, leer, actualizar, eliminar con filtros
- Grupos: Gestión de membresías y permisos
- Validación completa según especificación SCIM
- Logging estructurado con correlation IDs
- Validación de entrada con Pydantic
- Health checks para todos los servicios
- Métricas de performance y uso
prueba-sek/
├── app/ # Aplicación principal
│ ├── core/ # Configuración y utilidades centrales
│ │ ├── auth_middleware.py # Middleware de autenticación JWT
│ │ ├── config.py # Configuración de la aplicación
│ │ ├── database.py # Configuración de base de datos SQLite
│ │ ├── jwt_manager.py # Gestión de tokens JWT
│ │ ├── logger.py # Logging estructurado
│ │ ├── middleware.py # Middlewares adicionales
│ │ ├── policies.py # Carga de políticas ABAC
│ │ ├── policy_validator.py # Validación de políticas
│ │ └── startup.py # Inicialización de la aplicación
│ ├── models/ # Modelos de datos Pydantic
│ │ ├── abac.py # Modelos para ABAC
│ │ ├── auth.py # Modelos de autenticación
│ │ ├── database.py # Modelos de base de datos
│ │ └── scim.py # Modelos SCIM 2.0
│ ├── repositories/ # Capa de acceso a datos
│ │ ├── group_repository.py # Repositorio de grupos
│ │ ├── policy_repository.py # Repositorio de políticas
│ │ └── user_repository.py # Repositorio de usuarios
│ ├── services/ # Lógica de negocio
│ │ ├── abac_evaluator.py # Motor de evaluación ABAC
│ │ ├── auth_service.py # Servicio de autenticación
│ │ ├── authz_service.py # Servicio de autorización
│ │ ├── scim_group_service.py # Servicio de grupos SCIM
│ │ └── scim_user_service.py # Servicio de usuarios SCIM
│ └── views/ # Controladores/Routers FastAPI
│ ├── auth_router.py # Endpoints de autenticación
│ ├── authz.py # Endpoints de autorización
│ ├── scim_groups.py # Endpoints SCIM de grupos
│ └── scim_users.py # Endpoints SCIM de usuarios
├── policies/ # Políticas ABAC en JSON
│ └── policies.json # Configuración de políticas
├── data/ # Base de datos SQLite
├── logs/ # Archivos de log
├── Dockerfile # Configuración Docker
├── docker-compose.yml # Orquestación Docker
├── requirements.txt # Dependencias Python
├── .env.example # Plantilla de configuración
└── main.py # Punto de entrada
- Python 3.11+
- pip
- Docker (opcional)
- jq (para scripts de prueba)
-
Clonar el repositorio
git clone git@github.com:NivekTakedown/Identity-Microservice.git cd Identity-Microservice/ -
Crear y activar entorno virtual
python -m venv venv source venv/bin/activate # Linux/Mac # o venv\Scripts\activate # Windows
-
Instalar dependencias
pip install -r requirements.txt
-
Configurar variables de entorno
cp .env.example .env # Editar .env con tus configuraciones -
Crear directorios necesarios
mkdir -p data logs
-
Ejecutar la aplicación
python main.py
-
Clonar el repositorio
git clone git@github.com:NivekTakedown/Identity-Microservice.git cd Identity-Microservice/ -
Configurar variables de entorno
cp .env.example .env # Editar .env según necesidades -
Ejecutar con Docker Compose
docker-compose up --build
-
Verificar el estado
docker-compose ps docker-compose logs -f identity-service
# Health check
curl http://localhost:8000/health
# Documentación interactiva
open http://localhost:8000/docsEl sistema incluye usuarios de prueba predefinidos para testing:
| Usuario | Password | Departamento | Grupos | Risk Score | Descripción |
|---|---|---|---|---|---|
| mrios | admin_pass | IT | ADMINS | 15 | Administrador del sistema |
| jdoe | password123 | HR | HR_READERS | 20 | Usuario de Recursos Humanos |
| agonzalez | finance2024 | Finance | FIN_APPROVERS | 30 | Aprobador de Finanzas |
Para autenticación de servicios externos:
| Client ID | Client Secret | Scopes | Descripción |
|---|---|---|---|
| test_client | test_secret | read write | Cliente de prueba general |
| hr_app | hr_secret_2024 | read | Aplicación de RRHH |
| Grupo | Descripción | Permisos Típicos |
|---|---|---|
| ADMINS | Administradores del sistema | Acceso completo excepto prod crítico |
| HR_READERS | Lectores de Recursos Humanos | Acceso a datos de empleados y nómina |
| FIN_APPROVERS | Aprobadores de Finanzas | Aprobación de transacciones financieras |
| DEVELOPERS | Desarrolladores | Acceso a entornos de desarrollo |
-
Ejecutar pruebas completas
chmod +x test_all_endpoints.sh ./test_all_endpoints.sh
-
Pruebas manuales con cURL
# Obtener token JWT curl -X POST "http://localhost:8000/auth/token" \ -H "Content-Type: application/json" \ -d '{"grant_type":"password","username":"mrios","password":"admin_pass"}' # Evaluar autorización ABAC export JWT_TOKEN="<token-obtenido>" curl -X POST "http://localhost:8000/authz/evaluate" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $JWT_TOKEN" \ -d '{ "subject": {"dept": "IT", "groups": ["ADMINS"], "riskScore": 15}, "resource": {"type": "user_data", "env": "dev"}, "context": {"geo": "CL", "deviceTrusted": true} }'
| Método | Endpoint | Descripción | Auth |
|---|---|---|---|
| POST | /auth/token |
Obtener token JWT | No |
| GET | /auth/me |
Información del usuario actual | Sí |
| POST | /scim/v2/Users |
Crear usuario | No |
| GET | /scim/v2/Users/{id} |
Obtener usuario | No |
| POST | /scim/v2/Groups |
Crear grupo | No |
| POST | /authz/evaluate |
Evaluar autorización ABAC | Sí |
| GET | /authz/health |
Health check autorización | No |
| GET | docs | Documentación interactiva | No |
Las políticas se definen en policies.json y incluyen:
- ADMIN-OVERRIDE-01: Administradores acceden a todo excepto producción crítica
- HR-PAYROLL-01: HR puede acceder a nómina desde dispositivos confiables
- RISK-STEPUP-01: Usuarios de alto riesgo requieren autenticación adicional
- FINANCE-SENSITIVE-01: Datos financieros requieren verificación adicional
- BUSINESS-HOURS-01: Acceso permitido solo en horario laboral
- DEFAULT-DENY-01: Denegación por defecto cuando no hay políticas aplicables
// PERMIT
{
"decision": "Permit",
"reasons": ["ruleId: HR-PAYROLL-01"],
"advice": [],
"obligations": ["Log successful access"]
}
// CHALLENGE
{
"decision": "Challenge",
"reasons": ["ruleId: RISK-STEPUP-01"],
"advice": ["Additional authentication required"],
"obligations": ["Log challenge requirement"]
}
// DENY
{
"decision": "Deny",
"reasons": ["ruleId: DEFAULT-DENY-01"],
"advice": ["Contact administrator"],
"obligations": ["Log denied access attempt"]
}pytest tests/ -v# Logs en tiempo real
tail -f logs/app.log
# Logs estructurados en JSON
cat logs/app.log | jq '.'El archivo .env permite configurar:
- JWT_SECRET: Clave para firmar tokens JWT
- JWT_EXPIRE_MINUTES: Tiempo de expiración de tokens
- LOG_LEVEL: Nivel de logging (DEBUG, INFO, WARNING, ERROR)
- POLICIES_PATH: Ruta al archivo de políticas ABAC
- DB_PATH: Ruta de la base de datos SQLite
- FastAPI: Framework web moderno y rápido
- Pydantic: Validación de datos y serialización
- SQLite: Base de datos ligera para desarrollo
- JWT: Tokens seguros para autenticación
- structlog: Logging estructurado
- slowapi: Rate limiting
- Docker: Containerización
- ✅ Autenticación JWT con firmas seguras
- ✅ Validación de entrada con Pydantic
- ✅ Rate limiting por endpoint
- ✅ Middleware de autenticación
- ✅ Logging de auditoría
- ✅ CORS configurado
- ✅ Principio de mínimo privilegio con ABAC
- Usar RS256 con gestión de claves PKI
- Implementar refresh tokens
- Configurar HTTPS/TLS
- Usar base de datos empresarial (PostgreSQL)
- Implementar gestión de secretos (Vault, K8s Secrets)
- Configurar monitoreo y alertas
Este microservicio fue desarrollado como prueba técnica para demostrar competencias en:
- Diseño de microservicios seguros
- Integración con estándares IAM (SCIM, OAuth2, JWT)
- Implementación de ABAC
- Principio de mínimo privilegio
- Buenas prácticas de desarrollo
