# ============================================================ # lab-iam-oidc — un proveedor de identidad local y su cliente # ------------------------------------------------------------ # Lo usan las lecciones f07-rbac-abac y f07-oauth-oidc: seguir un # flujo OAuth 2.1 Authorization Code + PKCE de principio a fin, y # escribir politicas RBAC/ABAC que se puedan probar sobre los # claims que trae el token. # # navegador # ├── 127.0.0.1:8471 ──► idp (login, /authorize, /token, JWKS) # └── 127.0.0.1:8470 ──► cliente (/login, /callback, /recurso) # │ # │ oidc_interna (internal: true) # └──────────► idp (intercambio backchannel # del code y lectura de JWKS) # # El "code" viaja por el navegador; el intercambio por el code y la # lectura de las claves publicas (JWKS) van por la red interna, de # servidor a servidor. El cliente NUNCA ve el secreto de firma del # idp: valida el token con la clave publica que publica el JWKS. # # docker compose up -d --build levantar # docker compose down -v destruir # ============================================================ name: lab-iam-oidc networks: # idp y cliente publican en el host, asi que necesitan salida. oidc_borde: driver: bridge oidc_interna: driver: bridge internal: true services: # --- proveedor de identidad ------------------------------- # Genera un par RSA al arrancar, pide login, emite un code # ligado al PKCE y lo cambia por un access_token firmado. idp: build: ./app image: labiamoidc-app container_name: labiamoidc-idp command: ["python3", "/app/idp.py"] environment: - PORT=8000 - ISSUER=http://localhost:8471 - REDIRECT_URI=http://localhost:8470/callback ports: - "127.0.0.1:8471:8000" networks: - oidc_borde - oidc_interna restart: unless-stopped # --- aplicacion cliente + recurso protegido --------------- # Inicia el flujo con PKCE, recibe el code, lo intercambia por # backchannel, valida el token con el JWKS del idp y aplica la # politica RBAC/ABAC sobre cada recurso. cliente: build: ./app image: labiamoidc-app container_name: labiamoidc-cliente command: ["python3", "/app/cliente.py"] environment: - PORT=8000 # Por el navegador se ve al idp como localhost:8471; el # backchannel lo alcanza por la red interna como idp:8000. - IDP_PUBLICO=http://localhost:8471 - IDP_INTERNO=http://idp:8000 - REDIRECT_URI=http://localhost:8470/callback ports: - "127.0.0.1:8470:8000" depends_on: - idp networks: - oidc_borde - oidc_interna restart: unless-stopped