Skip to main content

Reusable Keycloak SDK for auth-service and microservices

Project description

Auth Guardian

auth-guardian es una libreria Python para proteger APIs con Keycloak/OIDC en FastAPI, con configuracion minima y enfoque plug-and-play.

Que resuelve

  • Login OIDC sin escribir todo el flujo a mano.
  • Proteccion de endpoints autenticados.
  • Control por roles (admin, support, etc.).
  • Helpers para validacion de tokens y extraccion de roles.

Instalacion

pip install auth-guardian

Documentacion oficial y paquete:

Configuracion minima

Define estas variables de entorno:

KEYCLOAK_BASE_URL=https://auth.tu-dominio.com
KEYCLOAK_REALM=tu-realm
KEYCLOAK_CLIENT_ID=tu-cliente
KEYCLOAK_CLIENT_SECRET=tu-secret

Tambien se aceptan alias legacy:

  • AUTH_BASE_URL
  • AUTH_REALM
  • AUTH_CLIENT_ID

Revocación de tokens

AuthGuardian esta orientado a revocacion inmediata con Keycloak:

  • Cada request valida el token por introspection contra Keycloak.
  • Si Keycloak responde active=false, la libreria rechaza con 401.
  • En logout, la libreria revoca el refresh_token en Keycloak y borra cookies.

Modo de validación de token

AuthGuardian usa validación por introspection:

Modo Comportamiento
introspection (default) Valida cada request contra Keycloak (/token/introspect)

Uso por código (introspection ya viene por defecto):

from auth_guardian import AuthGuardian

auth = AuthGuardian()

Notas:

  • Si active=false en introspection, se rechaza con 401.
  • Si Keycloak no está disponible, responde 503 sin exponer detalles internos.
  • Si cae la API de Keycloak, introspection falla aunque la BD de Keycloak siga arriba.
  • KEYCLOAK_CLIENT_SECRET se usa para introspection y, por defecto, para firmar/verificar state anti-CSRF.

Variables obligatorias

Si falta una variable obligatoria, AuthGuardian registra un log de error y falla al iniciar con mensaje claro.

Variables requeridas:

  • KEYCLOAK_BASE_URL
  • KEYCLOAK_REALM
  • KEYCLOAK_CLIENT_ID
  • KEYCLOAK_CLIENT_SECRET

Uso rapido en 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 /login
  • GET /oidc/callback
  • GET /logout
  • Proteccion por usuario autenticado y por rol.

Casos de uso comunes

  • Proteger endpoints internos de microservicios.
  • Habilitar login/logout en apps FastAPI sin implementar OIDC desde cero.
  • Restringir secciones administrativas por rol.
  • Validar tokens manualmente en procesos asincronos o workers.

Ejemplo de validacion manual

payload = await auth.get_validator().decode_access_token(token)
print(payload.get("sub"))

Caracteristicas opcionales

Multi-tenant (multiples realms)

from fastapi import Request

async def resolve_tenant(request: Request) -> str | None:
    return request.headers.get("X-Tenant-ID")

auth = AuthGuardian(tenant_resolver=resolve_tenant)

API publica estable

  • AuthGuardian
  • create_auth_router
  • extract_client_roles(payload, client_id)
  • AuthConfig
  • AuthTokenValidator
  • AuthOIDCClient
  • KeycloakAuthError
  • TokenValidationError
  • KeycloakAPIError

Buenas practicas

  • Usa variables de entorno por ambiente (dev/stage/prod).
  • No hardcodees secretos en codigo fuente.
  • Fija version en produccion (auth-guardian==x.y.z).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

auth_guardian-0.1.9.tar.gz (21.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

auth_guardian-0.1.9-py3-none-any.whl (20.5 kB view details)

Uploaded Python 3

File details

Details for the file auth_guardian-0.1.9.tar.gz.

File metadata

  • Download URL: auth_guardian-0.1.9.tar.gz
  • Upload date:
  • Size: 21.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for auth_guardian-0.1.9.tar.gz
Algorithm Hash digest
SHA256 92d2d5a86d531ac80660105acea4b24a5454e61d6413781b600faa56a46b270e
MD5 a80bf135066ab1ed0a43013a6c7ad3cc
BLAKE2b-256 ef7e60a544a6e44aed94323105c64ce33f3c3867c102546482fab2be133f5106

See more details on using hashes here.

File details

Details for the file auth_guardian-0.1.9-py3-none-any.whl.

File metadata

  • Download URL: auth_guardian-0.1.9-py3-none-any.whl
  • Upload date:
  • Size: 20.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.12

File hashes

Hashes for auth_guardian-0.1.9-py3-none-any.whl
Algorithm Hash digest
SHA256 e5b5121c7d3c5bd349ef13cb96cfbc28e3ebe62b6dc1b8d5be2fc3949efad926
MD5 3cf21a2ffd92eef7b8040d0c655079d5
BLAKE2b-256 7e323e98dfda428990fa1f94f036090686dc400cba59dafae3c331f6d414677a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page