
Dex 是一种身份服务,使用 OpenID Connect 为其他应用驱动身份认证。
Dex 通过连接器.充当通往其他身份提供者的门户。这使 dex 可以将身份认证委托给 LDAP 服务器、SAML 提供商,或 GitHub、Google 和 Active Directory 等成熟的身份提供者。客户端只需编写一次与 dex 通信的身份认证逻辑,随后由 dex 处理特定后端的协议。
ID Token 是 OpenID Connect 引入的一种 OAuth2 扩展,也是 dex 的主要功能。ID Token 是由 dex 签名的 JSON Web Token(JWT),作为 OAuth2 响应的一部分返回,用于证明终端用户的身份。一个 JWT 示例可能如下所示:
eyJhbGciOiJSUzI1NiIsImtpZCI6IjlkNDQ3NDFmNzczYjkzOGNmNjVkZDMyNjY4NWI4NjE4MGMzMjRkOTkifQ.eyJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjU1NTYvZGV4Iiwic3ViIjoiQ2djeU16UXlOelE1RWdabmFYUm9kV0kiLCJhdWQiOiJleGFtcGxlLWFwcCIsImV4cCI6MTQ5Mjg4MjA0MiwiaWF0IjoxNDkyNzk1NjQyLCJhdF9oYXNoIjoiYmk5NmdPWFpTaHZsV1l0YWw5RXFpdyIsImVtYWlsIjoiZXJpYy5jaGlhbmdAY29yZW9zLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJncm91cHMiOlsiYWRtaW5zIiwiZGV2ZWxvcGVycyJdLCJuYW1lIjoiRXJpYyBDaGlhbmcifQ.OhROPq_0eP-zsQRjg87KZ4wGkjiQGnTi5QuG877AdJDb3R2ZCOk2Vkf5SdP8cPyb3VMqL32G4hLDayniiv8f1_ZXAde0sKrayfQ10XAXFgZl_P1yilkLdknxn6nbhDRVllpWcB12ki9vmAxklAr0B1C4kr5nI3-BZLrFcUR5sQbxwJj4oW1OuG6jJCNGHXGNTBTNEaM28eD-9nhfBeuBTzzO7BKwPsojjj4C9ogU4JQhGvm_l4yfVi0boSx8c0FX3JsiB0yLa1ZdJVWVl9m90XmbWRSD85pNDQHcWZP9hR6CMgbvGkZsgjG32qeRwUL_eNkNowSBNWLrGNPoON1gMg
ID Token 包含的标准声明用于断言:哪个客户端应用让用户登录、令牌何时过期,以及用户的身份。
{
"iss": "http://127.0.0.1:5556/dex",
"sub": "CgcyMzQyNzQ5EgZnaXRodWI",
"aud": "example-app",
"exp": 1492882042,
"iat": 1492795642,
"at_hash": "bi96gOXZShvlWYtal9Eqiw",
"email": "[email protected]",
"email_verified": true,
"groups": [
"admins",
"developers"
],
"name": "Jane Doe"
}
由于这些令牌由 dex 签名,并且包含基于标准的声明,其他服务可以将其用作服务间凭据。已经能够消费 dex 签发的 OpenID Connect ID Token 的系统包括:
有关如何请求或验证 ID Token 的详细信息,请参阅"编写使用 dex 的应用"。
Dex 可以使用自定义资源定义(Custom Resource Definitions)原生运行在任何 Kubernetes 集群之上,并通过 OpenID Connect 插件驱动 API 服务器身份认证。客户端(如 kubelogin 和 kubectl)可以代表用户执行操作,这些用户可以通过 dex 支持的任何身份提供者登录集群。
当用户通过 dex 登录时,用户的身份通常存储在另一个用户管理系统中:LDAP 目录、GitHub 组织等。Dex 在客户端应用与上游身份提供者之间充当桥接层(shim)。客户端只需理解 OpenID Connect 即可查询 dex,而 dex 则实现了多种协议来查询其他用户管理系统。

「连接器」(connector)是 dex 用于向另一个身份提供者认证用户的一种策略。Dex 实现了针对 GitHub、LinkedIn、Microsoft 等特定平台的连接器,以及 LDAP 和 SAML 等成熟协议。
根据连接器的不同,协议上的限制可能会阻止 dex 签发刷新令牌或返回组成员资格声明。例如,由于 SAML 不提供非交互式的断言刷新方式,如果用户通过 SAML 连接器登录,dex 将不会向其客户端签发刷新令牌。对于需要离线访问的客户端(如 kubectl),刷新令牌支持是必需的。
Dex 实现了以下连接器:
Stable、beta 和 alpha 的定义如下:
连接器功能的所有更改或弃用都将在发布说明中公布。
有关入门、配置和使用指南,请参阅官方文档。
有关报告漏洞的详细信息,请参阅我们的安全政策。
请参阅 CONTRIBUTING.md 了解开发环境搭建、指南以及如何提交拉取请求。
本项目采用 Apache License, Version 2.0 许可。
| 名称 | 支持刷新令牌 | 支持 groups 声明 | 支持 preferred_username 声明 | 状态 | 备注 |
|---|
| LDAP | 是 | 是 | 是 | stable | |
| GitHub | 是 | 是 | 是 | stable | |
| SAML 2.0 | 否 | 是 | 否 | stable | 警告:已不再维护,可能存在认证绕过漏洞(#1884) |
| GitLab | 是 | 是 | 是 | beta | |
| OpenID Connect | 是 | 是 | 是 | beta | 包括 Salesforce、Azure 等。 |
| OAuth 2.0 | 否 | 是 | 是 | alpha | |
| 是 | 是 | 是 | alpha | ||
| 是 | 否 | 否 | beta | ||
| Microsoft | 是 | 是 | 否 | beta | |
| AuthProxy | 否 | 是 | 否 | alpha | 认证代理,如 Apache2 mod_auth 等。 |
| Bitbucket Cloud | 是 | 是 | 否 | alpha | |
| OpenShift | 是 | 是 | 否 | alpha | |
| Atlassian Crowd | 是 | 是 | 是 * | beta | preferred_username 声明必须通过配置进行设置 |
| Gitea | 是 | 否 | 是 | beta | |
| OpenStack Keystone | 是 | 是 | 否 | alpha |