跳到正文
Træfɪk

使用 JWT 保护 API 访问

Traefik Hub 功能

此中间件仅在 Traefik Hub 中可用。进一步了解 Traefik Hub 的高级功能。

JSON Web Token(JWT,定义见 RFC 7519)使 Traefik Hub API Gateway 能够通过私有签名密钥或公私钥签名的令牌,保护 API 访问。

Traefik Hub API Gateway 提供多种来源来执行令牌校验:

  • 在中间件配置中设置密钥值(signingSecret 选项)。
  • 设置公钥:此时,用户应使用私钥对令牌签名,公钥用于验证签名(publicKey 选项)。
  • 设置 JSON Web Key(JWK) 文件,定义用于验证传入 JWT 签名的一组 JWK(jwksFile 选项)。
  • 设置 JSON Web Key(JWK) URL,定义提供 JWK 集合的主机 URL(jwksUrl 选项)。

仅使用一个来源

JWT 中间件不允许同时设置多种传入令牌校验方式。 当 Hub API Gateway 收到必须通过 JWT 中间件校验的请求时,会使用上述配置的来源验证令牌。 如果令牌校验成功,则接受请求。

使用声明

JWT 可以包含以声明(键值对)形式表示的元数据。 JWT 中的声明可用于高级场景,例如通过 claims 增加授权层。

更多信息请参阅专门章节。

使用密钥验证 JWT

要让 Traefik Hub API Gateway 使用存储在 Kubernetes Secret 中的密钥值校验 JWT,请应用以下配置:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-jwt
  namespace: apps
spec:
  plugin:
    jwt:
      signingSecret: "urn:k8s:secret:jwt:signingSecret"
apiVersion: v1
kind: Secret
metadata:
  name: jwt
  namespace: apps
stringData:
  signingSecret: mysuperlongsecret
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app
  namespace: apps
spec:
  entryPoints:
    - websecure
  routes:
  - match: Path(`/my-app`)
    kind: Rule
    services:
    - name: whoami
      port: 80
    middlewares:
    - name: test-jwt
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  namespace: apps
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: traefik/whoami

---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: apps
spec:
  ports:
  - port: 80
    name: whoami
  selector:
    app: whoami

使用身份提供商验证 JWT

要让 Traefik Hub API Gateway 使用身份提供商校验 JWT(如下例中的 Keycloak 和 Azure AD),请应用以下配置:

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-jwt
  namespace: apps
spec:
  plugin:
    jwt:
      # Replace KEYCLOAK_URL and REALM_NAME with your values
      jwksUrl: https://KEYCLOAK_URL/realms/REALM_NAME/protocol/openid-connect/certs
      # Forward the content of the claim grp in the header Group
      forwardHeaders:
        Group: grp
      # Check the value of the claim grp before sending the request to the backend
      claims: Equals(`grp`, `admin`)
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-jwt
  namespace: apps
spec:
  plugin:
    jwt:
      jwksUrl: https://login.microsoftonline.com/common/discovery/v2.0/keys
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: my-app
  namespace: apps
spec:
  entryPoints:
    - websecure
  routes:
  - match: Path(`/my-app`)
    kind: Rule
    services:
    - name: whoami
      port: 80
    middlewares:
    - name: test-jwt
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  namespace: apps
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: traefik/whoami

---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: apps
spec:
  ports:
  - port: 80
    name: whoami
  selector:
    app: whoami

高级配置

高级选项见参考页面。

例如,可以使用从身份提供商获取的元数据限制对应用的访问。 为此,您可以使用 claims 选项;更多信息请参阅专门章节。


在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。

为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证