Servicio API construido con Python 3.11+ y FastAPI que actua como capa de autenticacion y gestion de sesiones para otras aplicaciones internas. Sus responsabilidades principales son:
+---------------------------+
| Cliente (navegador, |
| script, integracion) |
+-------------+-------------+
| HTTPS
v
+----------------------------+
| Proxy reverso |
| (nginx / traefik) |
| Termina TLS aqui |
+-------------+--------------+
| HTTP (red interna/privada)
v
+----------------------------+
| API FastAPI |
| (uvicorn, Python 3.11+) |
+---------+---------+--------+
| |
Autenticacion | | Persistencia
de usuarios | | (api_keys, user_sessions,
(doble bind) | | audit_log)
v v
+------------------+ +----------------------------+
| Servidor(es) | | Base de datos |
| OpenLDAP / | | SQLite / MariaDB / |
| compatible | | PostgreSQL (segun config) |
+------------------+ +----------------------------+
La API nunca guarda contrasenas de usuario ni valores en claro de API keys o tokens de sesion: solo un hash HMAC-SHA256 de estos ultimos (ver docs/SECURITY.mdā ).
Todos ellos viven bajo el prefijo /api/v1/auth:
| Metodo | Ruta | Descripcion |
|---|---|---|
| POST | /login | Autentica a un usuario contra LDAP (o valida una API key) y abre sesion. |
| GET | /groups | Devuelve los grupos LDAP (memberOf) del usuario autenticado. |
| GET | /me | Devuelve los atributos editables del usuario (mas uid/cn) con su valor actual. |
| PATCH | /me | Modifica atributos propios del usuario en LDAP (requiere su contrasena actual). |
| POST | /me/photo | Sube o reemplaza la foto de perfil (jpegPhoto), como multipart/form-data (requiere su contrasena actual). |
| GET | /me/photo | Devuelve la foto de perfil actual (Content-Type: image/jpeg), lista para usar como src de un <img>. |
| POST | /password | Cambia la propia contrasena LDAP (requiere la contrasena actual; invalida todas las sesiones). |
| POST | /password-reset/request | Publico (sin autenticacion). Solicita un restablecimiento de contrasena por email; siempre responde igual, exista o no el email. |
| POST | /password-reset/confirm | Publico (sin autenticacion). Confirma el restablecimiento con el token recibido por email. |
| POST | /apikeys | Genera una nueva API key de larga duracion para el usuario autenticado. |
| GET | /apikeys | Lista las API keys (activas, caducadas o revocadas) del usuario. |
| DELETE | /apikeys/{key_id} | Revoca una API key propiedad del usuario autenticado. |
| POST | /logoff | Cierra sesion: invalida todas las sesiones activas del usuario. |
Ademas, la API expone GET /api/v1/health como comprobacion de vida del servicio (sin
autenticacion). El detalle completo de peticiones/respuestas esta en
docs/API.mdā y, de forma interactiva, en Swagger UI (/docs).
# 1. Clonar el repositorio
git clone <url-del-repositorio> api
cd api
# 2. Copiar y ajustar la configuracion
cp config/config.example.yaml config/config.yaml
# Editar config/config.yaml: servidores LDAP, motor de base de datos, IPs permitidas, etc.
# 3. Copiar y completar las variables de entorno (secretos)
cp .env.example .env
# Editar .env: API_SECRET_KEY, LDAP_BIND_PASSWORD y, si aplica, DB_PASSWORD.
# 4. Arrancar el servicio en modo desarrollo
# (crea automaticamente un entorno virtual en ./venv, instala requirements.txt
# y lanza uvicorn con recarga automatica)
scripts/run_dev.sh
# Si se usa MariaDB o PostgreSQL en lugar de SQLite, instalar ademas, dentro de
# ese mismo entorno virtual, el driver correspondiente antes de arrancar:
# source venv/bin/activate
# pip install -r requirements-mariadb.txt # o requirements-postgresql.txt
# 5. Abrir la documentacion interactiva
# http://localhost:8000/docs (Swagger UI)
# http://localhost:8000/redoc (ReDoc)
Ademas de fijar la cookie de sesion habitual, POST /login devuelve tambien un access_token de
tipo bearer en el cuerpo de la respuesta, pensado para pegarlo directamente en el boton
"Authorize" de Swagger UI y probar asi los endpoints protegidos desde /docs (ver
docs/API.mdā ).
Para una instalacion detallada (incluyendo la creacion del esquema de base de datos con los
scripts SQL de sql/), ver docs/INSTALL.mdā .
El servicio tambien puede empaquetarse como imagen Docker, pensada para montarse con dos
volumenes externos (/config para el config.yaml real y /data para persistir la base de
datos SQLite y los logs) e instala de fabrica los drivers de los tres motores de base de datos
soportados. Arranque minimo:
docker build -t api-ldap:latest .
docker run -d -p 8000:8000 -v $(pwd)/config:/config:ro -v $(pwd)/data:/data --env-file .env api-ldap:latest
Ver docs/DOCKER.mdā para el detalle completo (incluye tambien el
docker-compose.yml incluido en el repositorio).
config/config.yaml.Este servicio esta diseƱado para ejecutarse detras de un proxy reverso (nginx, traefik o equivalente) en cualquier entorno de produccion. El proxy reverso es quien debe terminar TLS (certificado HTTPS) y reenviar el trafico a la API por HTTP en una red interna/privada; la propia API no implementa terminacion TLS. Ver tambien la recomendacion de filtrado de IPs de origen y demas medidas de seguridad en docs/SECURITY.mdā .
Content type
Image
Digest
sha256:1ac0d0e9fā¦
Size
85.9 MB
Last updated
about 1 month ago
docker pull vviudez/api-ldap