Docker Compose中Traefik ForwardAuth中间件未生效问题修复
修复Traefik ForwardAuth中间件配置,实现whoami服务的Bearer认证
核心问题:ForwardAuth相关配置(中间件定义+绑定)必须配置在需要被保护的服务容器上(也就是whoami容器),同时要确保认证服务能被Traefik内部访问,中间件逻辑正确关联。
以下是完整的可运行配置及说明:
1. 完整docker-compose.yml配置
version: '3.8' services: traefik: image: traefik:v2.11 command: - "--api.insecure=true" # 仅本地测试用,生产环境务必禁用 - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" ports: - "80:80" - "8080:8080" # Traefik控制台端口 volumes: - "/var/run/docker.sock:/var/run/docker.sock:ro" authserver: build: ./authserver # 指向你的authserver代码目录(含Dockerfile) labels: - "traefik.enable=true" - "traefik.http.services.authserver.loadbalancer.server.port=8080" # 认证服务仅需Traefik内部访问,无需暴露外部端口 whoami: image: traefik/whoami labels: - "traefik.enable=true" - "traefik.http.routers.whoami.entrypoints=web" - "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)" # 关键:给whoami的路由绑定ForwardAuth中间件 - "traefik.http.routers.whoami.middlewares=auth-middleware@docker" # 定义ForwardAuth中间件,指向认证服务的校验接口 - "traefik.http.middlewares.auth-middleware.forwardauth.address=http://authserver:8080/auth" # 允许将认证通过后的Authorization头转发给whoami服务 - "traefik.http.middlewares.auth-middleware.forwardauth.authResponseHeaders=Authorization" # 让Traefik转发客户端的原始请求头到认证服务 - "traefik.http.middlewares.auth-middleware.forwardauth.trustForwardHeader=true"
2. authserver.go 认证逻辑代码
确保校验逻辑正确,只有携带Authorization: Bearer me头的请求才会被放行:
package main import ( "net/http" ) func main() { http.HandleFunc("/auth", func(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if authHeader != "Bearer me" { w.WriteHeader(http.StatusUnauthorized) w.Write([]byte("Unauthorized")) return } // 认证通过,返回200让Traefik放行请求 w.WriteHeader(http.StatusOK) }) http.ListenAndServe(":8080", nil) }
3. authserver的Dockerfile
FROM golang:1.21-alpine AS builder WORKDIR /app COPY authserver.go . RUN go build -o authserver authserver.go FROM alpine:latest WORKDIR /app COPY --from=builder /app/authserver . EXPOSE 8080 CMD ["./authserver"]
关键配置说明
- 中间件必须绑定到目标服务的路由:只有在whoami的
routers.whoami.middlewares里指定中间件,访问该服务时才会触发认证校验。 - 认证服务的内部访问:Traefik通过Docker内置DNS解析
authserver:8080,无需给认证服务配置外部端口。 trustForwardHeader参数:必须开启,否则Traefik不会把客户端的Authorization头转发给认证服务,导致校验失败。
测试验证
- 启动所有服务:
docker-compose up -d - 不带认证头请求:
curl http://whoami.localhost,应返回401 Unauthorized - 带正确认证头请求:
curl -H "Authorization: Bearer me" http://whoami.localhost,应返回whoami的正常响应(包含请求信息)
内容的提问来源于stack exchange,提问作者Kurt Peek
相关产品推荐
相关产品推荐

