You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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头转发给认证服务,导致校验失败。

测试验证

  1. 启动所有服务:docker-compose up -d
  2. 不带认证头请求:curl http://whoami.localhost,应返回401 Unauthorized
  3. 带正确认证头请求:curl -H "Authorization: Bearer me" http://whoami.localhost,应返回whoami的正常响应(包含请求信息)

内容的提问来源于stack exchange,提问作者Kurt Peek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 02:36:09