π OAuth2 Proxy Integration with Entra ID
This environment uses OAuth2 Proxy in combination with Nginx to enforce authentication across selected domains, with Microsoft Entra ID (Azure Active Directory) serving as the centralized identity provider. Authentication is handled through dedicated OAuth2 Proxy instances, each associated with its own domain and configuration file under /etc/oauth2-proxy/. This approach ensures clean separation of concerns, predictable automation, and domain-specific access control.
Nginx delegates authentication to OAuth2 Proxy via auth_request, while OAuth2 Proxy validates tokens issued by Entra ID and injects identity headersβsuch as X-Auth-Request-User, X-Auth-Request-Email, and Authorization: Bearer <token>βinto upstream requests. Backend applications receive verified identity information without implementing OAuth2/OIDC logic.
For Step-by-step instructions on configuring a web service to use Entra ID as an Oauth2 identity provider using Ansible,
π See: Contributor Guide Adding Entra ID OAuth2 Support for a Web Service
βοΈ Nginx Configuration Example (code.refol.us)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name code.refol.us;
ssl_certificate /data/certs/code.refol.us/fullchain.pem;
ssl_certificate_key /data/certs/code.refol.us/privkey.pem;
index index.html index.htm index.php;
# Authentication entrypoint for oauth2-proxy
location = /oauth2/auth {
proxy_pass http://127.0.0.1:4180;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Content-Length "";
proxy_pass_request_body off;
}
# Protected application routes
location / {
auth_request /oauth2/auth;
error_page 401 = /oauth2/sign_in;
proxy_pass http://backend;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host code.refol.us;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_request_buffering off;
}
# Security hardening
location ~ /\.ht {
deny all;
}
# ACME challenge for Let's Encrypt
location /.well-known/acme-challenge/ {
root /var/www/certbot;
allow all;
}
}
π OAuth2 Proxy Configuration (code.refol.us)
# /etc/oauth2-proxy/oauth2-proxy_code.refol.us.cfg
http_address = "127.0.0.1:4180"
provider = "azure"
client_id = "YOUR_AZURE_APP_CLIENT_ID"
client_secret = "YOUR_AZURE_APP_CLIENT_SECRET"
oidc_issuer_url = "https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0"
redirect_url = "https://code.refol.us/oauth2/callback"
cookie_secret = "BASE64_32BYTE_RANDOM_STRING"
cookie_secure = true
cookie_http_only = true
cookie_expire = "168h"
cookie_refresh = "24h"
email_domains = ["refol.us"]
set_xauthrequest = true
pass_access_token = true
pass_authorization_header = true
request_logging = true
metrics_address = "127.0.0.1:9100"
For more details on OAuth2 Proxy Configuration file properties,
π See: OAuth2 Proxy Configuration File Documentation
π§© Configuration Highlights
-
Per-domain proxy isolation Each domain uses a dedicated OAuth2 Proxy instance bound to a unique loopback port.
-
Microsoft Entra ID integration Centralized identity, MFA enforcement, token issuance, and claim validation.
-
Strict redirect and cookie controls Ensures secure handling of user sessions and identity metadata.
-
Identity header injection Provides downstream services with validated user details.
π Authentication Flow
ASCII Diagram
User Browser β Nginx β oauth2-proxy β Microsoft Entra ID
β authenticated β
Backend
Step-by-Step Table
| Step | Component | Description |
|---|---|---|
| 1 | User Browser | Requests https://code.refol.us |
| 2 | Nginx | Calls auth_request /oauth2/auth |
| 3 | OAuth2 Proxy | Validates session; redirects to Entra ID if none exists |
| 4 | Microsoft Entra ID | Authenticates user, issues ID/Access tokens |
| 5 | OAuth2 Proxy | Validates tokens, sets identity headers |
| 6 | Nginx | Forwards authenticated request to backend |
| 7 | Backend Application | Processes request with verified identity |
π§Ύ Identity Headers and Mapping
| Header | Meaning / Use Case | Controlled By |
|---|---|---|
X-Auth-Request-User |
Userβs UPN/username | set_xauthrequest = true |
X-Auth-Request-Email |
Full user email | set_xauthrequest = true |
X-Auth-Request-Access-Token |
Raw access token | pass_access_token = true |
Authorization: Bearer <token> |
Standard OAuth2 bearer header | pass_authorization_header = true |
X-Auth-Request-Preferred-Username |
Preferred username claim | set_xauthrequest = true |
X-Auth-Request-Groups |
AD group memberships (if exposed) | set_xauthrequest = true |
β Summary
- Authentication comes from Microsoft Entra ID.
- OAuth2 Proxy validates tokens and injects identity headers.
- Nginx enforces authentication with
auth_request. - Backend services receive identity data without implementing OAuth2.
- Per-domain isolation ensures predictable, maintainable automation.
- Security and observability are built-in via strict cookie and logging controls.