Traefik

Traefik’s forwardAuth middleware delegates request authorization to an external service. Fairvisor Edge’s /v1/decision endpoint is fully compatible.

Kubernetes CRD

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: fairvisor-auth
  namespace: default
spec:
  forwardAuth:
    address: http://fairvisor-edge.default.svc.cluster.local:8080/v1/decision
    trustForwardHeader: true
    authResponseHeaders:
      - X-Fairvisor-Reason
      - Retry-After
      - RateLimit
      - RateLimit-Limit
      - RateLimit-Remaining
      - RateLimit-Reset

authResponseHeaders lists the headers from the Fairvisor response that Traefik should forward to the backend (on allow) or to the client (on reject). Include at minimum Retry-After and X-Fairvisor-Reason. Policy/rule attribution is debug-session-only (X-Fairvisor-Debug-*).

Attaching to an IngressRoute

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-api
  namespace: default
spec:
  entryPoints:
    - web
  routes:
    - match: PathPrefix(`/api/`)
      kind: Rule
      services:
        - name: my-api-service
          port: 3000
      middlewares:
        - name: fairvisor-auth

Docker Compose labels

services:
  my-api:
    image: my-api:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.my-api.rule=PathPrefix(`/api/`)"
      - "traefik.http.routers.my-api.middlewares=fairvisor-auth@docker"
      - "traefik.http.middlewares.fairvisor-auth.forwardauth.address=http://fairvisor-edge:8080/v1/decision"
      - "traefik.http.middlewares.fairvisor-auth.forwardauth.trustforwardheader=true"
      - "traefik.http.middlewares.fairvisor-auth.forwardauth.authResponseHeaders=Retry-After,X-Fairvisor-Reason,RateLimit-Remaining"

Static configuration (traefik.yml)

http:
  middlewares:
    fairvisor-auth:
      forwardAuth:
        address: "http://fairvisor-edge:8080/v1/decision"
        trustForwardHeader: true
        authResponseHeaders:
          - X-Fairvisor-Reason
          - Retry-After
          - RateLimit-Limit
          - RateLimit-Remaining
          - RateLimit-Reset

Headers forwarded to Fairvisor

Traefik forwards the original request headers to the forwardAuth endpoint, including Authorization. Fairvisor Edge extracts JWT claims, client IP, and other descriptor keys from these headers automatically.

trustForwardHeader: true instructs Traefik to trust the X-Forwarded-For header from upstream, so Fairvisor sees the correct client IP when Traefik sits behind another proxy.

Timeout

The default forwardAuth timeout in Traefik is 30 seconds. Reduce it to a few hundred milliseconds to avoid stalling requests if Fairvisor Edge is slow:

forwardAuth:
  address: "http://fairvisor-edge:8080/v1/decision"
  authRequestHeaders:
    - Authorization
  # Traefik does not expose a direct timeout field here;
  # configure the Fairvisor Edge service dial/read timeout
  # via the Traefik service definition.

Failure mode

Traefik forwardAuth fails-closed by default: if the auth service is unreachable, the request is rejected with 500. To implement fail-open, run a small nginx sidecar in front of Fairvisor Edge that returns 200 on upstream errors, or handle it at the service mesh level.