OAuth2-Proxy
OAuth2-Proxy es un servicio que actúa como puerta de entrada: delega la autenticación en un IdP (OIDC/OAuth2 como Entra ID) y, si el login es válido, inyecta cabeceras (email, nombre, grupos, token) hacia tus apps, evitando tener que modificar cada servicio. Con Traefik se usa mediante ForwardAuth; con Nginx/NPM, mediante auth_request al endpoint /auth de OAuth2-Proxy.
Enlaces
https://github.com/oauth2-proxy/oauth2-proxy/blob/master/README.md
Requisitos
- Docker instalado siguiendo los pasos de instalar
- Portainer configurado siguiendo los pasos de instalar portainer.
- Traefik configurado siguiendo los pasos de instalar Traefik
Entra ID (Azure AD) + OAuth2-Proxy (OIDC)
Registro App
Desde la consola de Microsoft Entra Admin Center (https://entra.microsoft.com), registra una nueva aplicación con un nombre descriptivo "OAuth-Proxy" y asegúrate de que la opción single tenant esté seleccionada. Establece Redirect URI para que apunte a https://auth.dominio.com/oauth2/callback
Secreto de cliente
https://learn.microsoft.com/es-es/entra/identity-platform/how-to-add-credentials?tabs=client-secret
Desde la consola de Microsoft Entra Admin Center (https://entra.microsoft.com), en Registros de aplicaciones, seleccione la aplicación creada anteriormente "OAuth-Proxy", seleccione Certificados y secretos>Secretos de cliente>Nuevo secreto de cliente:
-
Agregue una descripción para la clave secreta de cliente.
-
Seleccione una expiración para el secreto o especifique una duración personalizada.
- Registre el valor del secreto de cliente para usarlo en el código de la aplicación cliente. Este valor secreto nunca se muestra de nuevo después de salir de esta página.
Credenciales necesarias (del App Registration en Entra ID):
-
Client ID
-
Client Secret
-
Tenant ID
-
Redirect URL:
https://<tu-dominio>/oauth2/callback
Portainer
Add a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero «docker-compose.yml» y el contenido del fichero de variables
Fichero de variables
TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CLIENT_SECRET=xxxxx~xxxxxxxxxxxxxxxxxxxxxxxxxx
COOKIE_SECRET=generating-a-cookie-secret
Fichero docker-compose
services:
oauth2-proxy:
image: quay.io/oauth2-proxy/oauth2-proxy:latestv7.13.0
container_name: oauth2-proxy
restart: unless-stopped
command: - ["--http-address=0.0.0.0:4180
restart: unless-stopped4180"]
env_file: stack.env
environment:
# --- Entra ID (OIDC) ---
OAUTH2_PROXY_PROVIDER: "oidc"
OAUTH2_PROXY_OIDC_ISSUER_URL: "https://login.microsoftonline.com/${TENANT_ID}/v2.0"
OAUTH2_PROXY_CLIENT_ID: "${CLIENT_ID}"
OAUTH2_PROXY_CLIENT_SECRET: "${CLIENT_SECRET}"
# 🔴 Callback en el MISMO HOST de la app:
OAUTH2_PROXY_REDIRECT_URL: "https://auth.app.dominio.com/oauth2/callback"
OAUTH2_PROXY_WHITELIST_DOMAINS:# ".dominio.com"--- OAUTH2_PROXY_EMAIL_DOMAINS:Seguridad "*"/ cookies ---
OAUTH2_PROXY_COOKIE_SECRET: "${COOKIE_SECRET}" # 32 bytes Base64
OAUTH2_PROXY_COOKIE_SECURE: "true"
OAUTH2_PROXY_COOKIE_SAMESITE: "lax"
OAUTH2_PROXY_EMAIL_DOMAINS: "*"
OAUTH2_PROXY_REVERSE_PROXY: "true"
OAUTH2_PROXY_SET_XAUTHREQUEST: "true"
#OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: útil para Nginx/NPM"true"
OAUTH2_PROXY_PASS_ACCESS_TOKEN: "true"
OAUTH2_PROXY_WHITELIST_DOMAINS: ".ictiberia.com"
# útil--- siApp eldetrás upstream(reverse-proxy) necesita bearer
OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: "true"
OAUTH2_PROXY_REVERSE_PROXY: "true"---
OAUTH2_PROXY_UPSTREAMS: "file:http:///dev/null"whoami:80"
#networks: modo “auth-gateway” sin proxy a app[proxy]
labels:
- traefik.enable=true
- traefik.docker.network=traefik_public
# Publica directamente la APP a través de oauth2-proxy
- traefik.http.routers.oauth2-proxy.app.rule=Host(`auth.app.dominio.com`)
- traefik.http.routers.oauth2-proxy.app.entrypoints=websecure
- traefik.http.routers.app.tls=true
- traefik.http.routers.oauth2-proxy.app.tls.certresolver=letsencrypt
- traefik.http.routers.app.service=oauth2
- traefik.http.services.oauth2-proxy.app.loadbalancer.server.port=4180
- traefik.http.services.app.loadbalancer.server.scheme=http
whoami:
image: traefik/whoami
container_name: whoami
restart: unless-stopped
networks: -[proxy]
proxy# sin labels: NO se publica directo (lo publica oauth2-proxy)
networks:
proxy:
external: true
Con Entra ID usa el proveedor OIDC. El issuer suele ser: https://login.microsoftonline.com/<TENANT_ID>/v2.0, y los scopes típicos: openid profile email.
En este punto ya puedes ir a https://auth.dominio.com/oauth2/sign_in y probar la validación
Integración con Traefik (ForwardAuth)
Añade al fichero traefik_dynamic.yml los middleware:
services:
oauth-backend:
loadBalancer:
servers:
- url: http://oauth2-proxy:4180
middlewares:
auth-headers:
headers:
sslRedirect: true
stsSeconds: 315360000
browserXssFilter: true
contentTypeNosniff: true
forceSTSHeader: true
sslHost: example.com
stsIncludeSubdomains: true
stsPreload: true
frameDeny: true
oauth-auth:
forwardAuth:
address: http://oauth2-proxy:4180/oauth2/auth
trustForwardHeader: true
oauth-errors:
errors:
status:
- "401-403"
service: oauth-backend
query: "/oauth2/sign_in?rd={url}"

Traefik delega la auth a OAuth2-Proxy; si /auth devuelve 2xx, pasa la request. Un middleware ForwardAuth apuntando a http://oauth2-proxy:4180/auth reenvía cabeceras útiles (p. ej., X-Auth-Request-Email).
Añadiendo a la aplicaciones que queramos validar la etiqueta: traefik.http.routers.app.middlewares=oauth2proxy@docker
Labels
labels:
- traefik.http.routers.app.middlewares=oauth2proxy@docker
cambia en la etiqueta "app" por el valor nombre de tu aplicación


