SSO 和认证协议

单点登录(SSO)

单点登录(SSO) 是一种认证机制,允许用户只需登录一次即可访问多个应用程序,无需重复输入凭据。Keycloak 通过基于浏览器的会话 Cookie(作用域限定在 Realm 内)实现 SSO。

当用户通过 Keycloak 进行认证时:

  1. Keycloak 建立会话并在浏览器中发放会话 Cookie。
  2. 当用户访问同一 Realm 中注册的另一个应用时,该应用会重定向到 Keycloak。
  3. Keycloak 检测到已有的会话 Cookie,向应用发放新的令牌,无需用户再次登录。

SSO 仅适用于单个 Realm。不同 Realm 之间的用户需要分别认证。

单点登出(SLO)

Keycloak 也支持单点登出(SLO)。当用户从一个应用登出时,Keycloak 可以将登出操作传播到所有共享同一 SSO 会话的其他应用,所有活动会话同时终止。

支持的协议

Keycloak 支持三大主流身份和授权协议:

OpenID Connect (OIDC)

OpenID Connect 是构建在 OAuth 2.0 之上的现代身份层,是大多数新应用推荐使用的协议。

关键概念:

概念说明
ID Token包含经过认证用户身份声明的 JSON Web Token (JWT)
Access Token授权访问受保护资源或 API 的令牌
Refresh Token用于在无需重新认证的情况下获取新访问令牌的长期令牌
UserInfo Endpoint返回经过认证用户声明的受保护端点

Keycloak 支持的常见 OIDC 流程:

  • 授权码流程:服务器端 Web 应用的标准流程。客户端用授权码换取令牌。
  • 带 PKCE 的授权码流程:推荐用于单页应用(SPA)和移动应用。增加代码挑战以防止截获攻击。
  • 客户端凭据流程:用于无用户参与的机器对机器(M2M)通信。
  • 设备授权流程:用于输入受限设备(智能电视、物联网设备)。

OAuth 2.0

OAuth 2.0 是一种授权框架,允许应用程序获取对第三方服务用户账户的有限访问权限。Keycloak 在 OAuth 2.0 流程中充当授权服务器。

Keycloak 支持所有标准 OAuth 2.0 授权类型:

授权类型使用场景
authorization_code有用户参与的 Web 和移动应用
client_credentials服务间认证
refresh_token使用刷新令牌获取新的访问令牌
device_code无浏览器或输入受限设备

SAML 2.0

安全断言标记语言(SAML)2.0 是一种基于 XML 的协议,广泛用于企业身份联合。Keycloak 既支持作为服务提供商(SP),也支持作为身份提供商(IdP)。

Keycloak 中常见的 SAML 使用场景:

  • 集成使用 SAML 的企业身份提供商(如 Active Directory Federation Services、Azure AD)。
  • 为仅支持 SAML 的传统企业应用提供 SSO。

协议选择指南

场景推荐协议
新建 Web 应用OpenID Connect(授权码 + PKCE)
单页应用(SPA)OpenID Connect(授权码 + PKCE)
移动应用OpenID Connect(授权码 + PKCE)
微服务 / API 访问OAuth 2.0(客户端凭据)
传统企业应用SAML 2.0
物联网 / 智能设备OpenID Connect(设备授权流程)

令牌生命周期

Keycloak 发放有时间限制的令牌。令牌寿命可针对每个 Realm 进行配置:

令牌类型默认寿命配置项
Access Token5 分钟accessTokenLifespan
Refresh Token30 分钟(会话绑定)ssoSessionMaxLifespan
ID Token5 分钟与 Access Token 相同

短生命周期的访问令牌降低了令牌被盗用的风险。应用应使用刷新令牌透明地获取新的访问令牌。