Keycloak 是一款开源的身份认证与访问管理软件,为现代应用和服务提供单点登录能力。它以 OpenID Connect、OAuth 2.0 和 SAML 2.0 等标准协议为基础,把用户存储、登录界面和授权判断集中到一台独立服务器上,使应用无需各自处理账号与密码。该项目最初由红帽公司主导,2023 年 4 月捐赠给云原生计算基金会并成为孵化级项目[1]。
定义
Keycloak 是一个开源的身份与访问管理(Identity and Access Management,IAM)解决方案,用于为应用程序、接口和微服务提供统一的身份认证、授权与用户管理[2]。从使用的角度看,它是一台独立运行的服务器,应用被配置为由它来保护和提供身份信息,而不是各自保存和校验用户口令。它基于 OpenID Connect、OAuth 2.0 与 SAML 2.0 等公开标准协议工作,因此支持这些协议的客户端都可以与之对接[3]。
在 Keycloak 的数据模型中,领域(Realm)是一个独立的管理单元,负责管理一组用户、凭据、角色与组;不同领域彼此隔离,只能管理并认证自己控制范围内的用户[4]。希望接入的应用需要注册为客户端(Client),每个客户端可以获得专属的角色命名空间[4]。软件采用 Apache 许可证 2.0 发布,主要编程语言为 Java[5]。
原理
Keycloak 的核心思路是把认证过程从业务应用里抽出来。浏览器应用在需要登录时,会把用户浏览器重定向到 Keycloak 认证服务器,由服务器要求输入凭据[6]。重定向之所以关键,在于用户与业务应用完全分离,应用始终看不到用户的登录凭据[6]。
认证完成后,应用会拿到经过加密签名的令牌或断言,其中可以携带用户名、地址、电子邮箱等身份信息,也可以携带权限数据,供应用据此作出授权判断[6]。身份令牌提供用户身份信息,访问令牌则作为 HTTP 请求的一部分,用于取得被调用服务的访问权,二者分别属于 OpenID Connect 与 OAuth 2.0 规范的内容[4]。用户登录后会建立会话,会话记录登录时间以及该次单点登录中参与过的应用,管理员和用户可以查看会话信息[4]。协议映射器(Protocol Mapper)用于按客户端定制写入令牌或断言的声明内容[4]。
发展历程
Keycloak 的第一个生产版本发布在 2014 年 9 月,其开发工作在此前约一年就已开始[7]。2014 年 7 月,项目开发者曾说明该版本以 OAuth 2.0 与 OpenID Connect 为基础,并计划从当年 9 月起加入 SAML 支持[8]。2016 年,红帽把其单点登录产品从基于 PicketLink 框架改为基于 Keycloak 上游项目,此前 PicketLink 的代码库已被合并进 Keycloak[7]。在某种程度上,Keycloak 也可视为红帽 JBoss SSO 开源产品的接替者,后者此前由 PicketLink 取代[9]。
2022 年 2 月的版本 17 起,Keycloak 在原有发行版之外并行提供基于 Quarkus 的发行版;2022 年 11 月发布的版本 20 之后,仅提供 Quarkus 版本[10]。改用 Quarkus 后,启动速度与内存占用都有改善,同时启动命令由原来的方式改为 kc 命令[10]。2022 年 7 月的版本 19 中,大量客户端适配器被废止,OpenID Connect 侧仅保留 JavaScript 适配器[10]。
2023 年 4 月 11 日,云原生计算基金会宣布 Keycloak 以孵化级项目身份加入,直接进入该基金会项目生命周期的第二阶段[11]。在此之前,项目自 2018 年前后即开始申请加入该基金会,最初提议为沙箱级,2020 年改为申请孵化级,但因维护者仅限一家公司、底层仍基于传统 Java 应用服务器等原因未获通过[12]。改用 Quarkus 并引入红帽以外的维护者后,申请最终获得批准[12]。
应用
单点登录是最典型的使用方式。用户向 Keycloak 而非单个应用进行认证,登录一次后访问其他应用无需重复登录,注销时也只需注销一次即可退出所有使用 Keycloak 的应用。身份代理与社交登录是另一类常见场景,管理员可以在管理控制台中配置以社交网络登录,也可以通过 OpenID Connect 或 SAML 2.0 身份提供者认证用户,无需修改应用代码。Keycloak 自身即可充当身份提供者,把企业用户目录或第三方身份提供者的认证结果转换为基于标准的令牌[13]。
用户联合方面,Keycloak 内置对 LDAP 与 Active Directory 服务器的连接支持,也可以自行实现提供者以对接关系型数据库等其他用户存储。管理员通过管理控制台集中管理服务器的各项功能,包括用户、权限与会话,并定义细粒度的授权策略;用户则通过账户管理控制台自行更新资料、修改密码和设置双因素认证。在 Kubernetes 环境中,项目提供 Operator 以简化部署、运维与扩缩容[14]。官方发行版包含容器镜像,适用于容器与编排平台[15]。
局限
Keycloak 社区版与红帽的商业发行版在支持条件上存在差异。社区版由红帽工程师与社区贡献者共同维护,迭代较快,单个版本的支持周期通常为 6 至 12 个月,且不提供官方服务级别协议,问题依赖社区讨论解决[16]。相应的商业发行版由红帽商业团队维护,迭代较慢,可提供长达 7 年以上的商业支持,但需要商业订阅[16]。
在功能层面,社区版可能包含实验性功能,其稳定性依具体场景而定[17]。版本迭代也带来迁移成本:以 Quarkus 为底层的版本删除了端点路径中的 auth 前缀,若要保持原有地址需要额外指定启动参数[10]。升级还需留意数据库结构变更,因为结构变更无法回滚,自动升级一旦失败恢复较为困难[16]。此外,当所有管理员账户被锁定后,重新获得实例访问权是一个复杂的过程[18]。
参见
参考资料
- Keycloak [引用日期2026-10-14]
- 概述 - Keycloak on AWS [引用日期2026-10-14]
- Keycloak [引用日期2026-10-14]
- redhat.com 上的 PDF 文件 [引用日期2026-10-14]
- bugreport [引用日期2026-10-14]
- redhat.com 上的 PDF 文件 [引用日期2026-10-14]
- Keycloak [引用日期2026-10-14]
- [keycloak-dev] PicketLink and KC Integration [引用日期2026-10-14]
- Keycloak [引用日期2026-10-14]
- thinkit.co.jp 上的网页 [引用日期2026-10-14]
- heise.de 上的网页 [引用日期2026-10-14]
- mm20230426 [引用日期2026-10-14]
- Chapter 1. Overview [引用日期2026-10-14]
- Keycloak 概述 - Alauda Knowledge [引用日期2026-10-14]
- Downloads 26.0.1 [引用日期2026-10-14]
- Alauda Build of Keycloak [引用日期2026-10-14]
- Alauda Application Services Identity Management E1 [引用日期2026-10-14]
- Keycloak [引用日期2026-10-14]