Skip to main content
Version: v0.15

ForwardAuth Middleware

The ForwardAuth middleware delegates authentication and authorization decisions to an external service, enabling centralized access control for your applications. This pattern is particularly useful for implementing Single Sign-On (SSO) and centralized authentication across multiple services.

Overview​

The middleware intercepts incoming requests and forwards them to a designated authentication service. Based on the authentication service's response, it either allows the request to proceed or blocks it with an appropriate error or redirect response.

Authentication Flow​

  1. Request Interception: The middleware captures incoming requests matching configured paths
  2. Forward to Auth Service: Sends the request details to the configured authentication service
  3. Decision Based on Response:
    • 200 OK: Request is authenticated and forwarded to the backend
    • 401/403: Access denied, optionally redirects to sign-in page
    • Other codes: Treated as authentication errors, access denied

Configuration​

Basic Configuration​

middlewares:
- name: forward-auth
type: forwardAuth
paths:
- /admin
rule:
authUrl: http://auth-service:8080/verify

Configuration Parameters​

ParameterTypeRequiredDefaultDescription
authUrlstringYes-URL of the authentication service endpoint
authSignInstringNo-Redirect URL for unauthenticated users (401 responses).
If URL ends with a query parameter (e.g., ?rd=), the current request URL is automatically appended
insecureSkipVerifybooleanNofalseSkip SSL certificate verification for auth service
forwardHostHeadersbooleanNofalseForward the original Host header to auth service
authRequestHeadersarrayNo[]Request headers to include in auth requests
addAuthCookiesToResponsearrayNoall cookiesAuth cookies to include in response headers
authResponseHeadersarrayNo[]Map auth response headers to request headers
authResponseHeadersAsParamsarrayNo[]Map auth response headers to request parameters

Path Configuration​

The paths field supports flexible pattern matching:

  • Exact paths: /admin, /api/users
  • Wildcard patterns: /admin/.*, /api/.*/users
  • Regex patterns: /api/v[0-9]+/.*

Automatically Forwarded Headers​

The middleware automatically includes these headers in authentication requests:

  • X-Forwarded-Host - Original request host
  • X-Forwarded-Method - HTTP method of original request
  • X-Forwarded-Proto - Protocol (http/https) of original request
  • X-Forwarded-For - Client IP address chain
  • X-Real-IP - Real client IP address
  • User-Agent - Client user agent string
  • X-Original-URL - Complete original request URL
  • X-Forwarded-URI - Original request URI

Advanced Configuration Examples​

Complete ForwardAuth Setup​

middlewares:
- name: comprehensive-auth
type: forwardAuth
paths:
- /admin/.*
- /api/private/.*
rule:
authUrl: http://auth-service:8080/auth/verify
# Redirect URL - current URL automatically appended to 'redirect=' parameter
authSignIn: http://auth-service:8080/login?redirect=
insecureSkipVerify: false
forwardHostHeaders: true

# Include specific headers in auth requests
authRequestHeaders:
- Authorization
- X-API-Key
- X-Client-Version

# Control which auth cookies are returned
addAuthCookiesToResponse:
- session_id
- auth_token

# Map auth service headers to request headers
authResponseHeaders:
- "x-user-id: X-Auth-User-ID" # Custom mapping
- "x-user-roles: X-Auth-Roles" # Custom mapping
- X-Auth-Email # Direct mapping

# Add auth headers as request parameters
authResponseHeadersAsParams:
- "x-user-id: userId" # Custom parameter name
- "x-user-roles: userRoles" # Custom parameter name
- X-Auth-Email # Direct mapping

Authentik Integration Example​

version: "1.0"
gateway:
writeTimeout: 10
readTimeout: 15
idleTimeout: 30

routes:
# Protected application route
- path: /
name: protected-app
backends:
- endpoint: https://internal-app.example.com
middlewares:
- authentik-forward-auth

# Authentik outpost route (must be unprotected)
- path: /outpost.goauthentik.io
name: authentik-outpost
backends:
- endpoint: http://authentik-outpost:9000
middlewares: [] # No auth middleware for outpost endpoints

middlewares:
- name: authentik-forward-auth
type: forwardAuth
paths:
- /admin
rule:
authUrl: http://authentik:9000/outpost.goauthentik.io/auth/nginx
# Redirect URL - current URI automatically appended to 'rd=' parameter
authSignIn: http://authentik:9000/outpost.goauthentik.io/start?rd=
forwardHostHeaders: true
insecureSkipVerify: false

# Include Authentik user information in requests
authResponseHeaders:
- X-authentik-username
- X-authentik-groups
- X-authentik-email
- X-authentik-name
- X-authentik-uid
- X-authentik-jwt

Development Environment Setup​

middlewares:
- name: dev-auth
type: forwardAuth
paths:
- /admin/.*
rule:
authUrl: https://dev-auth.local:8443/verify
authSignIn: https://dev-auth.local:8443/login?next=
insecureSkipVerify: true # OK for development only
forwardHostHeaders: true

authRequestHeaders:
- Authorization
- X-Debug-User

authResponseHeaders:
- "x-dev-user: X-Auth-User"
- X-Auth-Roles

Header Mapping Syntax​

Direct Mapping​

When no custom mapping is specified, headers are passed through directly:

authResponseHeaders:
- X-User-ID # Auth service header X-User-ID → Request header X-User-ID
- X-User-Roles # Auth service header X-User-Roles → Request header X-User-Roles

Custom Mapping​

Use colon syntax to map auth service headers to different request header names:

authResponseHeaders:
- "auth-user-id: X-Current-User" # auth-user-id → X-Current-User
- "auth-permissions: X-User-Perms" # auth-permissions → X-User-Perms

Parameter Mapping​

Similar syntax applies to parameter mappings:

authResponseHeadersAsParams:
- "X-User-ID: currentUserId" # Header X-User-ID → Parameter currentUserId
- "X-User-Roles: roles" # Header X-User-Roles → Parameter roles
- X-User-Email # Header X-User-Email → Parameter X-User-Email

Authentication Service Requirements​

Response Codes​

Your authentication service should return:

  • 200 OK: User is authenticated and authorized
  • 401 Unauthorized: User is not authenticated (triggers redirect if authSignIn configured)
  • 403 Forbidden: User is authenticated but not authorized for this resource
  • Other codes: Treated as errors, access denied

Expected Headers​

The auth service receives forwarded headers and can use them for decision-making:

  • Use X-Original-URL for path-based authorization
  • Use X-Forwarded-Method for method-based rules
  • Use custom headers specified in authRequestHeaders

Response Headers​

The auth service can include headers in responses that will be:

  • Mapped to request headers via authResponseHeaders
  • Added as request parameters via authResponseHeadersAsParams
  • Set as cookies via addAuthCookiesToResponse

Security Considerations​

SSL/TLS Configuration​

  • Always use HTTPS for production authentication services
  • Set insecureSkipVerify: false in production environments
  • Use proper SSL certificates to prevent man-in-the-middle attacks

Header Security​

  • Validate and sanitize headers in your authentication service
  • Be cautious about which headers you forward to backend services
  • Consider header injection risks when mapping auth response headers

Redirect Security​

  • Validate redirect URLs to prevent open redirect vulnerabilities
  • Use allowlisted domains for authSignIn URLs
  • Consider implementing CSRF protection for authentication flows

Troubleshooting​

Common Issues​

Authentication loops or repeated redirects

  • Check that auth service endpoints are excluded from protection
  • Verify authSignIn URL is accessible without authentication
  • Ensure auth service doesn't redirect authenticated requests

Headers not being forwarded

  • Verify header names match exactly (case-sensitive)
  • Check that auth service is returning expected headers
  • Confirm header mapping syntax is correct

SSL/Certificate errors

  • Verify SSL certificates are valid and trusted
  • Check if insecureSkipVerify should be enabled temporarily for debugging
  • Ensure auth service is accessible at the configured URL