Reusable Keycloak SDK for auth-service and microservices
Project description
Auth Guardian
auth-guardian es una libreria Python para integrar autenticacion OIDC con Keycloak en FastAPI, con enfoque de seguridad, revocacion inmediata y configuracion simple.
Paquete y documentación
Qué resuelve
- Flujo OIDC (
/login,/oidc/callback,/logout) sin implementarlo a mano. - Proteccion de endpoints autenticados.
- Control de acceso por roles.
- Validacion de access token por introspection contra Keycloak (default).
- Revocacion inmediata en logout (refresh token revoke + invalidacion por introspection).
Instalación
pip install auth-guardian
Variables obligatorias
La libreria falla al iniciar si falta alguna variable requerida y registra un log claro indicando cual falta.
KEYCLOAK_BASE_URLKEYCLOAK_REALMKEYCLOAK_CLIENT_IDKEYCLOAK_CLIENT_SECRET
Ejemplo de .env minimo:
KEYCLOAK_BASE_URL=http://localhost:8080
KEYCLOAK_REALM=master
KEYCLOAK_CLIENT_ID=my-app-client
KEYCLOAK_CLIENT_SECRET=tu-secret
Configuración recomendada en Keycloak
Para el cliente que usa la API:
- Crear cliente OIDC.
- Activar autenticacion de cliente (
Client authentication/ confidential client). - Configurar
Client Secret. - Configurar redirect URI de la app para callback OIDC.
- Verificar roles en realm/client segun tu modelo de autorizacion.
Nota: KEYCLOAK_CLIENT_SECRET se usa para introspection y tambien, por defecto, para firmar/verificar state anti-CSRF.
Integración rápida con FastAPI
from fastapi import Depends, FastAPI
from auth_guardian import AuthGuardian, create_auth_router
app = FastAPI()
auth = AuthGuardian()
app.include_router(
create_auth_router(
auth=auth,
login_redirect_url="/dashboard",
logout_redirect_url="/login",
)
)
@app.get("/health")
async def health() -> dict[str, str]:
return {"status": "ok"}
@app.get("/ejemplo/v1")
async def ejemplo_v1(user: dict = Depends(auth.get_current_user)):
return {
"mensaje": f"Hola {user.get('preferred_username')}",
"email": user.get("email"),
}
@app.get("/ejemplo/v2")
async def ejemplo_v2(user: dict = Depends(auth.require_role("admin"))):
return {"mensaje": "Acceso permitido para rol admin"}
Con esto tienes:
GET /loginGET /oidc/callbackGET /logout- Proteccion por usuario autenticado y por rol.
Flujo visual (imágenes)
1) Login OIDC
sequenceDiagram
participant U as Usuario
participant A as API FastAPI
participant K as Keycloak
U->>A: GET /login
A->>K: Redirect Authorization Request
K-->>U: Login UI
U->>K: Credenciales
K-->>A: Redirect /oidc/callback?code=...
A->>K: Exchange code por tokens
K-->>A: access_token + refresh_token
A-->>U: Set cookies + redirect app
2) Request protegido (introspection)
sequenceDiagram
participant C as Cliente
participant A as API
participant K as Keycloak
C->>A: Request con token
A->>K: POST /token/introspect
K-->>A: { active: true/false }
alt active=true
A-->>C: 200 OK
else active=false
A-->>C: 401 Unauthorized
end
3) Logout
sequenceDiagram
participant U as Usuario
participant A as API
participant K as Keycloak
U->>A: GET /logout
A->>K: POST /revoke (refresh_token)
K-->>A: 200/204
A-->>U: Delete cookies + redirect
Validación de token
AuthGuardian usa introspection por defecto:
| Modo | Comportamiento |
|---|---|
introspection (default) |
Valida cada request contra Keycloak (/token/introspect) |
Notas operativas:
- Si
active=false, responde401. - Si Keycloak no está disponible, responde
503sin filtrar detalles internos. - Si cae la API de Keycloak, introspection falla aunque la BD de Keycloak siga arriba.
Troubleshooting
Falta una variable obligatoria
Síntoma:
- Error al iniciar con mensaje
Missing required configuration variables.
Accion:
- Completar las variables Keycloak requeridas en entorno.
Introspection devuelve 401 o 403
Síntoma:
- Error relacionado a introspection denegada.
Accion:
- Verificar
KEYCLOAK_CLIENT_SECRET. - Verificar que el cliente en Keycloak tenga autenticacion de cliente habilitada.
Redirect URI o callback incorrecto
Síntoma:
- Login falla en callback o mismatch en Keycloak.
Accion:
- Revisar la configuracion de redirect URI del cliente en Keycloak.
- Si estas detras de proxy, revisar cabeceras
HostyX-Forwarded-*.
API pública estable
AuthGuardiancreate_auth_routerextract_client_roles(payload, client_id)AuthConfigAuthTokenValidatorAuthOIDCClientKeycloakAuthErrorTokenValidationErrorKeycloakAPIError
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file auth_guardian-0.1.10.tar.gz.
File metadata
- Download URL: auth_guardian-0.1.10.tar.gz
- Upload date:
- Size: 21.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c8b07e59065b32c85e65d0e99dd4c45f2e9c78756e08ea635d0bacc324475c8e
|
|
| MD5 |
1388583178895e3d4bc09ccb9ed976ff
|
|
| BLAKE2b-256 |
4c4600f27da7ce48fbea1bf28c29c78cdaf73dd7d7253de3fe5b22eed8397d10
|
File details
Details for the file auth_guardian-0.1.10-py3-none-any.whl.
File metadata
- Download URL: auth_guardian-0.1.10-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e906bf6e91ad45ff72bef5926fb13145f3b3506f99ab7779d2624cb195c2515e
|
|
| MD5 |
ba9d8dd1bd73005f5f81ef5d2dca9452
|
|
| BLAKE2b-256 |
98aa11a5baf0e2e20d8ed25bba2cad9b5f6a70953a7fb076a89ffa37fc0b2397
|