跳到正文
Træfɪk

<span class="nav-link-with-icon">Client Credentials <img src="https://doc.traefik.io/traefik-hub/img/ps-traefik-hub-logo-light.svg" class="menu-icon" alt="Traefik Hub API Gateway"></span>

Traefik Hub 功能

此中间件仅在 Traefik Hub 中提供。了解更多 Traefik Hub 高级功能。

OAuth 2.0 客户端凭据认证中间件允许 Traefik Hub 使用 RFC 6749 中描述的 OAuth 2.0 客户端凭据流程保护路由。 可以使用外部 KV 存储缓存访问令牌。

OAuth 客户端凭据认证中间件支持使用 Redis(或 Sentinel)作为持久化 KV 存储,在授权访问令牌 有效期间存储它们。这可以降低延迟,并减少对授权服务器的调用次数。


配置示例

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-client-creds
spec:
  plugin:
    oAuthClientCredentials:
      url: https://tenant.auth0.com/oauth/token
      clientID: urn:k8s:my-secret:my-secret:clientID
      clientSecret: urn:k8s:my-secret:my-secret:clientSecret
      audience: https://api.example.com
      forwardHeaders:
        Group: grp
        Expires-At: exp
      claims: Equals(`grp`, `admin`)
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-secret
stringData:
  clientID: my-oauth-client-name
  clientSecret: mypasswd

配置选项

字段 说明 默认值 必填
audience 定义在授权服务器中配置的受众。
受众值是所访问资源的基础地址,例如:https://api.example.com。
"" 是
claims 定义为授权请求而需要验证的声明。
claims 选项仅可用于 JWT 格式的令牌。(更多信息见此处)
"" 否
clientConfig.tls.ca PEM 编码的证书包,或引用包含此证书包的 Secret 的 URN;该证书包用于与授权服务器建立 TLS 连接。(更多信息见此处) "" 否
clientConfig.tls.cert PEM 编码的证书,或引用包含此证书的 Secret 的 URN;该证书用于与 Vault 服务器建立 TLS 连接。(更多信息见此处) "" 否
clientConfig.tls.key PEM 编码的密钥,或引用包含此密钥的 Secret 的 URN;该密钥用于与 Vault 服务器建立 TLS 连接。(更多信息见此处) "" 否
clientConfig.tls.insecureSkipVerify 与授权服务器通信时禁用 TLS 证书验证。
可用于测试,但强烈不建议在生产环境使用。(更多信息见此处)
false 否
clientConfig.timeoutSeconds 定义向授权服务器发出请求后,放弃等待之前的时长。 5 否
clientConfig.maxRetries 定义向授权服务器发送请求失败时的重试次数。 3 否
clientID 定义 OpenID Connect 提供商中某个账户的唯一客户端标识符;设置 clientSecret 时必须设置。
更多信息见此处。
"" 是
clientSecret 定义 OpenID Connect 提供商中某个账户的唯一客户端密钥;设置 clientID 时必须设置。
更多信息见此处。
"" 是
forwardHeaders 定义要添加到请求中的 HTTP 头,并使用从授权服务器返回的访问令牌声明中提取的值填充。
如果 JWT 中找不到要转发的声明,相应头的值为空。
forwardHeaders 选项仅可用于 JWT 格式的令牌。
[] 否
store.keyPrefix 定义用于存储会话的条目的键前缀。 "" 否
store.secret 定义将访问令牌存储到 Redis 时使用的加密密钥。长度必须为 16、24 或 32 个字符。配置 store 时必填。 "" 是(配置 store 时)
store.redis.endpoints 要连接的 Redis 实例端点(例如 redis.traefik-hub.svc.cluster.local:6379)。 "" 是
store.redis.username Traefik Hub 连接 Redis 时使用的用户名。 "" 否
store.redis.password Traefik Hub 连接 Redis 时使用的 password。 "" 否
store.redis.database Traefik Hub 用于存储信息的数据库(默认值:0)。 0 否
store.redis.cluster 启用 Redis Cluster 模式。设置为 {} 时启用;省略时禁用。 - 否
store.redis.tls.ca 自定义 CA 证书包。 "" 否
store.redis.tls.cert TLS 证书。 "" 否
store.redis.tls.key TLS。 "" 否
store.redis.tls.insecureSkipVerify 允许跳过 TLS 验证。 false 否
store.redis.sentinel.masterSet 用于主节点选择的主节点集合名称。使用 Sentinel 时必填。 "" 是(使用 Sentinel 时)
store.redis.sentinel.username Sentinel 认证使用的用户名(可以与 username 不同)。 "" 否
store.redis.sentinel.password Sentinel 认证使用的密码(可以与 password 不同)。 "" 否
url 定义授权服务器 URL(例如:https://tenant.auth0.com/oauth/token)。 "" 是
usernameClaim 定义需要求值的声明,以填充访问日志中的 clientusername。
usernameClaim 选项仅可用于 JWT 格式的令牌。
"" 否

在 Kubernetes Secret 中存储机密值

可以引用与 Middleware 位于同一命名空间中的 Kubernetes Secret。 Kubernetes Secret 的引用采用 URN 格式:

urn:k8s:secret:[name]:[valueKey]

claims 声明

语法

claims 支持以下函数:

函数 说明 示例
Equals 验证 key 中的值是否等于 value。 Equals(`grp`, `admin`)
Prefix 验证 key 中的值是否以 value 为前缀。 Prefix(`referrer`, `http://example.com`)
Contains(字符串) 验证 key 中的值是否包含 value。 Contains(`referrer`, `/foo/`)
Contains(数组) 验证 key 数组是否包含 value。 Contains(`areas`, `home`)
SplitContains 验证 key 中的值按分隔符拆分后是否包含 value。 SplitContains(`scope`, ` `, `writer`)
OneOf 验证 key 数组是否包含 values 中的任意一个值。 OneOf(`areas`, `office`, `lab`)

所有函数都可以通过布尔运算符连接。支持以下运算符:

运算符 说明 示例
&& 比较两个函数,仅当二者都求值为 true 时返回 true。 Equals(`grp`, `admin`) && Equals(`active`, `true`)
|| 比较两个函数,只要任意一个求值为 true 就返回 true。 Equals(`grp`, `admin`) || Equals(`active`, `true`)
! 函数为 true 时返回 false,否则返回 true。 !Equals(`grp`, `testers`)

对于以下数据结构,所有示例都会返回 true:

{
  "active": true,
  "grp": "admin",
  "scope": "reader writer deploy",
  "referrer": "http://example.com/foo/bar",
  "areas": [
    "office",
    "home"
  ]
}

嵌套声明

在键之间使用 . 可以支持嵌套声明。例如:

user.name
{
  "active": true,
  "grp": "admin",
  "scope": "reader writer deploy",
  "referrer": "http://example.com/foo/bar",
  "areas": [
    "office",
    "home"
  ],
  "user": {
    "name": "John Snow",
    "status": "undead"
  }
}
John Snow

处理包含 '.' 的键

如果 key 包含点号,可以使用 \. 转义。

处理包含 '\' 的键

如果 key 包含 \,则需要写成两个:\\。

clientConfig 客户端配置

定义 API 网关连接身份提供商等第三方软件时使用的配置。

clientConfig.tls TLS 配置

在 Kubernetes Secret 中存储机密值

配置 tls.ca、tls.cert、tls.key 时,可以引用与 Middleware 位于同一命名空间中的 Kubernetes Secret。 Kubernetes Secret 的引用采用 URN 格式:

urn:k8s:secret:[name]:[valueKey]
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-client-creds
spec:
  plugin:
    oAuthClientCredentials:
      clientConfig:
        tls:
          ca: "urn:k8s:secret:tls:ca"
          cert: "urn:k8s:secret:tls:cert"
          key: "urn:k8s:secret:tls:key"
          insecureSkipVerify: true
apiVersion: v1
kind: Secret
metadata:
  name: tls
stringData:
  ca: |-
    -----BEGIN CERTIFICATE-----
    MIIB9TCCAWACAQAwgbgxGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHDAaBgNV
    BAsME0RvY3VtZW50IERlcGFydG1lbnQxOTA3BgNVBAMMMFdoeSBhcmUgeW91IGRl
    Y29kaW5nIG1lPyAgVGhpcyBpcyBvbmx5IGEgdGVzdCEhITERMA8GA1UEBwwISGFt
    aWx0b24xETAPBgNVBAgMCFBlbWJyb2tlMQswCQYDVQQGEwJCTTEPMA0GCSqGSIb3
    DQEJARYAMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ9WRanG/fUvcfKiGl
    EL4aRLjGt537mZ28UU9/3eiJeJznNSOuNLnF+hmabAu7H0LT4K7EdqfF+XUZW/2j
    RKRYcvOUDGF9A7OjW7UfKk1In3+6QDCi7X34RE161jqoaJjrm/T18TOKcgkkhRzE
    apQnIDm0Ea/HVzX/PiSOGuertwIDAQABMAsGCSqGSIb3DQEBBQOBgQBzMJdAV4QP
    Awel8LzGx5uMOshezF/KfP67wJ93UW+N7zXY6AwPgoLj4Kjw+WtU684JL8Dtr9FX
    ozakE+8p06BpxegR4BR3FMHf6p+0jQxUEAkAyb/mVgm66TyghDGC6/YkiKoZptXQ
    98TwDIK/39WEB/V607As+KoYazQG8drorw==
    -----END CERTIFICATE-----
  cert: |-
    -----BEGIN CERTIFICATE-----
    MIIB9TCCAWACAQAwgbgxGTAXBgNVBAoMEFF1b1ZhZGlzIExpbWl0ZWQxHDAaBgNV
    BAsME0RvY3VtZW50IERlcGFydG1lbnQxOTA3BgNVBAMMMFdoeSBhcmUgeW91IGRl
    Y29kaW5nIG1lPyAgVGhpcyBpcyBvbmx5IGEgdGVzdCEhITERMA8GA1UEBwwISGFt
    aWx0b24xETAPBgNVBAgMCFBlbWJyb2tlMQswCQYDVQQGEwJCTTEPMA0GCSqGSIb3
    DQEJARYAMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ9WRanG/fUvcfKiGl
    EL4aRLjGt537mZ28UU9/3eiJeJznNSOuNLnF+hmabAu7H0LT4K7EdqfF+XUZW/2j
    RKRYcvOUDGF9A7OjW7UfKk1In3+6QDCi7X34RE161jqoaJjrm/T18TOKcgkkhRzE
    apQnIDm0Ea/HVzX/PiSOGuertwIDAQABMAsGCSqGSIb3DQEBBQOBgQBzMJdAV4QP
    Awel8LzGx5uMOshezF/KfP67wJ93UW+N7zXY6AwPgoLj4Kjw+WtU684JL8Dtr9FX
    ozakE+8p06BpxegR4BR3FMHf6p+0jQxUEAkAyb/mVgm66TyghDGC6/YkiKoZptXQ
    98TwDIK/39WEB/V607As+KoYazQG8drorw==
    -----END CERTIFICATE-----
  key: |-
    -----BEGIN EC PRIVATE KEY-----
    MHcCAQEEIC8CsJ/B115S+JtR1/l3ZQwKA3XdXt9zLqusF1VXc/KloAoGCCqGSM49
    AwEHoUQDQgAEpwUmRIZHFt8CdDHYm1ikScCScd2q6QVYXxJu+G3fQZ78ScGtN7fu
    KXMnQqVjXVRAr8qUY8yipVKuMCepnPXScQ==
    -----END EC PRIVATE KEY-----

store.redis Redis 存储

Redis 服务器的连接参数配置在 Middleware 部署中。

支持以下 Redis 模式:

提示

如果使用 Redis 单实例模式或 Redis Sentinel,可以配置 database 字段。 如果使用 Redis Cluster,此值不会生效(仅可使用数据库 0)。

此时将显示一条警告,并忽略该值。

更多 Redis 信息,建议参阅 Redis 官方文档。


在生产环境使用 Traefik OSS?

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

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


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

文档由 HeadFile Studio 翻译。

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