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 流程:

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

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)使用 SAML。

Keycloak 中常见的 SAML 使用场景:

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

协议选择指南

场景推荐协议
新建 Web 应用OpenID Connect(Authorization Code + PKCE)
单页应用(SPA)OpenID Connect(Authorization Code + PKCE)
移动应用OpenID Connect(Authorization Code + PKCE)
微服务 / API 访问OAuth 2.0(Client Credentials)
传统企业应用SAML 2.0
物联网 / 智能设备OpenID Connect(Device Authorization Flow)

令牌生命周期

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

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

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