第 12 章 管理 OpenID Connect 和 SAML 客户端
客户端是可以请求用户身份验证的实体。客户端采用两种形式:第一个客户端类型是希望参与单点登录的应用程序。这些客户端只需要使用红帽构建的 Keycloak 为其提供安全性。另一种类型的客户端是请求访问令牌,以便它能够代表经过身份验证的用户调用其他服务。本节讨论配置客户端的各个方面,以及进行它的各种方法。
12.1. 管理 OpenID Connect 客户端 复制链接链接已复制到粘贴板!
OpenID Connect 是保护应用程序的建议协议。它设计为使用 Web 友好型,它最适合 HTML5/JavaScript 应用程序。
12.1.1. 创建 OpenID Connect 客户端 复制链接链接已复制到粘贴板!
要保护使用 OpenID 连接协议的应用程序,您可以创建一个客户端。
流程
- 点菜单中的 Clients。
单击 Create client。
创建客户端
- 将 Client type 设置为 OpenID Connect。
输入 客户端 ID。
此 ID 是一个字母数字字符串,用于 OIDC 请求以及红帽构建的 Keycloak 数据库来识别客户端。
为客户端提供 名称。
如果您计划本地化这个名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息 ,请参阅服务器开发人员指南。
- 点击 Save。
此操作会创建客户端,并将您带到 Settings 选项卡,您可以在其中 执行基本配置。
12.1.2. 基本配置 复制链接链接已复制到粘贴板!
Settings 选项卡包含许多配置此客户端的选项。
设置标签页
12.1.2.1. 常规设置 复制链接链接已复制到粘贴板!
- 客户端 ID
- OIDC 请求以及 Red Hat build of Keycloak 数据库用于识别客户端的字母数字字符 ID 字符串。
- Name
- 红帽构建的 Keycloak UI 屏幕中的客户端名称。要本地化名称,请设置替换字符串值。例如,字符串值,如 ${myapp}。如需更多信息 ,请参阅服务器开发人员指南。
- 描述
- 客户端的描述。此设置也可以是本地化。
- 始终在控制台中显示
- 在帐户控制台中始终列出此客户端,即使此用户没有活跃的会话。
12.1.2.2. 访问设置 复制链接链接已复制到粘贴板!
- 根 URL
- 如果红帽构建的 Keycloak 使用任何配置的相对 URL,则该值会添加到其中。
- 主页 URL
- 提供当 auth 服务器需要重定向或链接回客户端时的默认 URL。
- 有效的 Redirect URI
必填字段。输入 URL 模式,然后单击 + 以添加 和 - 以删除现有 URL,然后单击 Save。确切的(区分大小写)字符串匹配用于比较有效的重定向 URI。
您可以在 URL 模式的末尾使用通配符。例如
http://host.com/path/*。为避免安全问题,如果传递的重定向 URI 包含 userinfo 部分或其路径 来管理对 父目录的访问(/../),则不会执行通配符比较,但标准和安全匹配的字符串匹配。完整的通配符
*有效重定向 URI 也可以配置为允许任何 http 或 https 重定向 URI。请不要在生产环境中使用它。专用重定向 URI 模式通常更安全。如需更多信息,请参阅 Unspecific Redirect URI。
- Web Origins
输入 URL 模式并点 + 添加和 - 删除现有 URL。点 Save。
此选项处理 跨资源共享(CORS)。如果浏览器 JavaScript 尝试对域域与 JavaScript 代码来自的服务器的 AJAX HTTP 请求,则请求必须使用 CORS。服务器必须处理 CORS 请求,否则浏览器不会显示或允许处理请求。这个协议可防止 XSS、CSRF 和其他基于 JavaScript 的攻击。
此处列出的域 URL 嵌入到发送到客户端应用程序的访问令牌中。客户端应用使用此信息决定是否允许在其上调用 CORS 请求。只有红帽构建的 Keycloak 客户端适配器支持此功能。如需更多信息 ,请参阅保护应用程序和服务指南。
- 管理 URL
- 客户端的回调端点。服务器使用此 URL 进行回调,如推送撤销策略、执行后备通道注销和其他管理操作。对于红帽构建的 Keycloak servlet 适配器,此 URL 可以是 servlet 应用程序的 root URL。如需更多信息,请参阅 保护应用程序和服务指南。
12.1.2.3. 功能配置 复制链接链接已复制到粘贴板!
- 客户端身份验证
OIDC 客户端的类型。
ON
对于执行浏览器登录并需要客户端 secret 的服务器端客户端,在生成访问令牌请求时。此设置应用于服务器端应用程序。
OFF
对于执行浏览器登录的客户端。因为无法确保 secret 可以与客户端内部客户端保持安全,因此务必要通过配置正确的重定向 URI 来限制访问。
- 授权
- 启用或禁用对此客户端的细粒度授权支持。
- 标准流
- 如果启用,这个客户端可以使用 OIDC 授权代码流。
- 直接访问授予
- 如果启用,这个客户端可以使用 OIDC Direct Access Grants。
- 隐式流
- 如果启用,这个客户端可以使用 OIDC Implicit Flow。
- 服务帐户角色
-
如果启用,此客户端可以向红帽构建的 Keycloak 进行身份验证,并检索专用于此客户端的访问令牌。在 OAuth2 规范中,这启用了为这个客户端
授予客户端凭证的支持。 - 身份验证 2.0 设备授权
- 如果启用,这个客户端可以使用 OIDC 设备授权。
- OIDC CIBA Grant
- 如果启用,这个客户端可以使用 OIDC Client Initiated Backchannel Authentication Grant。
12.1.2.4. 登录设置 复制链接链接已复制到粘贴板!
- 登录主题
- 用于登录、OTP、授予注册和忘记密码页面的主题。
- 需要同意
如果启用,用户必须同意客户端访问。
对于执行浏览器登录的客户端。因为无法确保 secret 可以与客户端内部客户端保持安全,因此务必要通过配置正确的重定向 URI 来限制访问。
- 在屏幕上显示客户端
如果 Consent Required is Off,则应用此开关。
关
consent 屏幕将仅包含与配置的客户端范围对应的同意。
On
在同意屏幕上也会有一个有关此客户端本身的项目。
- 客户端同意屏幕文本
- 如果启用了 Consent required 和 Display client on screen,则适用。包含此客户端有关权限的同意屏幕上的文本。
12.1.2.5. 注销设置 复制链接链接已复制到粘贴板!
- 前端频道注销
-
如果启用了 Front Channel Logout,应用程序应能够根据 OpenID Connect Front-Channel Logout 规格通过前端频道注销用户。如果启用,您还应提供
Front-Channel Logout URL。 - 前端通道注销 URL
- 红帽构建的 Keycloak 用于通过前端向客户端发送注销请求的 URL。
- Backchannel logout URL
- 当一个注销请求发送到这个域(通过 end_session_endpoint)时,导致客户端自行注销的 URL。如果省略,则不会向客户端发送注销请求。
- 需要 backchannel logout 会话
- 指定在使用 Backchannel Logout URL 时,是否在 Logout Token 中包含会话 ID Claim。
- Backchannel logout revoke offline session
- 指定在使用 Backchannel Logout URL 时,是否在 Logout Token 中包含 revoke_offline_access 事件。当收到带有此事件的 Logout Token 时,红帽构建的 Keycloak 将撤销离线会话。
12.1.3. 高级配置 复制链接链接已复制到粘贴板!
完成 Settings 选项卡上的字段后,您可以使用其他选项卡来执行高级配置。
12.1.3.1. 高级标签页 复制链接链接已复制到粘贴板!
当您点 Advanced 选项卡时,会显示其他字段。有关特定字段的详情,点该字段的问号图标。但是,本节中详细介绍某些字段。
12.1.3.2. 细粒度 OpenID Connect 配置 复制链接链接已复制到粘贴板!
徽标 URL
引用客户端应用程序徽标的 URL。
策略 URL
Relying party Client 提供的 URL 提供给 End-User,以阅读有关如何使用配置集数据的 URL。
服务 URL 条款
过期客户端向最终用户提供 URL,以阅读有关重新处理服务条款的 URL。
签名和加密的 ID 令牌支持
红帽构建的 Keycloak 可以根据 Json Web 加密(JWE)规范加密 ID 令牌。管理员确定是否为每个客户端加密 ID 令牌。
用于加密 ID 令牌的密钥是内容加密密钥(CEK)。红帽构建的 Keycloak 和客户端必须协商使用哪个 CEK 以及如何交付它。用于确定 CEK 的方法是密钥管理模式。红帽构建的 Keycloak 支持的密钥管理模式是密钥加密。
在密钥加密中:
- 客户端生成非对称加密密钥对。
- 公钥用于加密 CEK。
- 红帽构建的 Keycloak 会为每个 ID 令牌生成一个 CEK
- 红帽构建的 Keycloak 使用生成的 CEK 加密 ID 令牌
- 红帽构建的 Keycloak 使用客户端的公钥加密 CEK。
- 客户端使用其私钥解密此加密的 CEK
- 客户端使用解密的 CEK 解密 ID 令牌。
客户端以外的任何方可以解密 ID 令牌。
客户端必须通过其公钥将 CEK 加密到红帽 Keycloak 的构建。红帽构建的 Keycloak 支持从客户端提供的 URL 下载公钥。客户端必须根据 Json Web Keys (JWK) 规范提供公钥。
该流程是:
- 打开客户端的 Keys 选项卡。
- 将 JWKS URL 切换到 ON。
- 在 JWKS URL 文本框中输入客户端的公钥 URL。
密钥加密算法在 Json Web Algorithm (JWA) 规范中定义。红帽构建的 Keycloak 支持:
- RSAES-PKCS1-v1_5(RSA1_5)
- RSAES OAEP 使用默认参数(RSA-OAEP)
- RSAES OAEP 256 使用 SHA-256 和 MFG1 (RSA-OAEP-256)
选择算法的步骤为:
- 打开客户端 的高级 选项卡。
- 打开 Fine Grain OpenID Connect 配置。
- 从 ID Token Encryption Content Algorithm 下拉菜单中选择算法。
12.1.3.3. OpenID Connect 兼容性模式 复制链接链接已复制到粘贴板!
本节存在向后兼容。单击问号图标以获取有关每个字段的详细信息。
启用 OAuth 2.0 通用 TLS 证书绑定访问令牌
双向 TLS 将访问令牌和刷新令牌与客户端证书绑定,该证书在 TLS 握手过程中交换。这个绑定可防止攻击者使用 stolen 令牌。
这种类型的令牌是 holder-of-key 令牌。与 bearer 令牌不同,holder-of-key 令牌的接收者可以验证令牌的发送者是否合法。
如果此设置为 on,则工作流为:
- 令牌请求在授权代码流或混合流中发送到令牌端点。
- 红帽构建的 Keycloak 请求客户端证书。
- 红帽构建的 Keycloak 接收客户端证书。
- 红帽构建的 Keycloak 可以成功验证客户端证书。
如果验证失败,红帽构建的 Keycloak 会拒绝令牌。
在以下情形中,红帽构建的 Keycloak 将验证客户端发送访问令牌或刷新令牌:
- 令牌刷新请求通过 holder-of-key 刷新令牌发送到令牌端点。
- UserInfo 请求被发送到带有 holder-of-key 访问令牌的 UserInfo 端点。
- 通过 holder-of-key 刷新令牌向非OIDC 兼容红帽构建的 Keycloak 专有 Logout 端点发送一个注销请求。
如需了解更多详细信息,请参阅 OAuth 2.0 通用 TLS 客户端身份验证和证书绑定访问令牌 中的 Mutual TLS 客户端证书绑定访问令牌。https://datatracker.ietf.org/doc/html/draft-ietf-oauth-mtls-08#section-3
目前,红帽构建的 Keycloak 客户端适配器不支持拥有者的密钥令牌验证。红帽构建的 Keycloak 适配器将访问和刷新令牌视为 bearer 令牌。
OAuth 2.0 在应用层(DPoP)上演示概念验证.
DPoP 将访问令牌和刷新令牌与客户端的密钥对的公钥部分绑定。这个绑定可防止攻击者使用 stolen 令牌。
这种类型的令牌是 holder-of-key 令牌。与 bearer 令牌不同,holder-of-key 令牌的接收者可以验证令牌的发送者是否合法。
如果客户端切换 OAuth 2.0 DPoP Bound Access Tokens Enabled,则工作流为:
- 令牌请求在授权代码流或混合流中发送到令牌端点。
- 红帽构建的 Keycloak 请求 DPoP 证明。
- 红帽构建的 Keycloak 接收 DPoP 证明。
- 红帽构建的 Keycloak 可以成功验证 DPoP 证明。
如果验证失败,红帽构建的 Keycloak 会拒绝令牌。
如果交换机 OAuth 2.0 DPoP Bound Access Tokens Enabled 已关闭,客户端仍然可以在令牌请求中发送 DPoP 证明。在这种情况下,红帽构建的 Keycloak 将验证 DPoP 证明,并将 thumbprint 添加到令牌中。但是,如果交换机关闭,则此客户端的 Keycloak 服务器的红帽构建不会强制使用 DPoP 绑定。如果要确保特定客户端始终使用 DPoP 绑定,则建议在 上进行这个切换。
在以下情形中,红帽构建的 Keycloak 将验证客户端发送访问令牌或刷新令牌:
- 令牌刷新请求通过 holder-of-key 刷新令牌发送到令牌端点。此验证仅对公共客户端完成,如 DPoP 规范中所述。对于机密客户端,不会作为具有正确客户端凭据的客户端身份验证进行验证,以确保请求来自合法客户端。对于公共客户端,访问令牌和刷新令牌都是 DPoP 绑定。对于机密客户端,只有访问令牌是 DPoP 绑定。
- UserInfo 请求被发送到带有 holder-of-key 访问令牌的 UserInfo 端点。
- 一个注销请求会被发送到一个非 OIDC 兼容红帽构建的 Keycloak 专有 logout 端点,并带有拥有者(holder-of-key refresh)令牌。此验证仅对上述的公共客户端进行。
如需了解更多详细信息,请参阅 OAuth 2.0 演示 Possession (DPoP)。
目前,红帽构建的 Keycloak 客户端适配器不支持 DPoP 持有者的令牌验证。红帽构建的 Keycloak 适配器将访问和刷新令牌视为 bearer 令牌。
DPoP 只是一个技术预览,并不被支持。此功能默认为禁用。
使用 --features=preview 或 --features=dpop启动服务器
OIDC 的高级配置
OpenID Connect 的 Advanced Settings 允许您在客户端级别上配置 会话和令牌超时的覆盖。
| Configuration | 描述 |
|---|---|
| 访问令牌生命周期 | 该值会覆盖名称相同的 realm 选项。 |
| 客户端会话空闲 | 该值会覆盖名称相同的 realm 选项。该值应小于全局 SSO 会话空闲。 |
| 客户端会话最大数 | 该值会覆盖名称相同的 realm 选项。该值应小于全局 SSO Session Max。 |
| 客户端离线会话空闲 | 此设置允许您为客户端配置较短的离线会话闲置超时。超时是红帽构建 Keycloak 撤销其离线令牌前会话闲置的时间长度。如果没有设置,则使用 realm Offline Session Idle。 |
| 客户端离线会话 Max | 此设置允许您为客户端配置较短的离线会话最大生命周期。生命周期是红帽构建的 Keycloak 撤销对应的离线令牌前的最长时间。这个选项需要在域中全局启用 Session Max Limited,默认为 Offline Session Max。 |
代码交换代码挑战方法的证明密钥
如果攻击者窃取合法客户端的授权代码,则代码交换的概念验证(PKCE)会阻止攻击者获得适用于代码的令牌。
管理员可以选择以下选项之一:
- (空)
- 红帽构建的 Keycloak 不适用 PKCE,除非客户端向红帽构建的 Keycloak 授权端点发送适当的 PKCE 参数。
- S256
- 红帽构建的 Keycloak 适用于代码质询方法为 S256 的客户端 PKCE。
- plain
- 红帽构建的 Keycloak 适用于代码质询方法为 plain 的客户端 PKCE。
如需了解更多详细信息,请参阅 OAuth 公共客户端的代码交换的 RFC 7636 概念验证。
ACR 到身份验证级别(LoA)映射
在客户端的高级设置中,您可以定义哪个 Authentication Context Class Reference (ACR) 值映射到哪个 级别的身份验证(LoA)。此映射也可以在域中指定,如 ACR 到 LoA 映射 中所述。最佳实践是在域级别上配置此映射,它允许在多个客户端间共享相同的设置。
当从此客户端发送到红帽构建的 Keycloak 时,Default ACR 值可以用来指定默认值 ,但没有附加了cr_values 参数的 claim 参数。 请参阅官方 OIDC 动态客户端注册规格。
请注意,默认的 ACR 值用作默认级别,但它无法可靠地用于强制使用特定级别的登录。例如,假设您将 Default ACR 值 配置为级别 2。然后,默认情况下,用户需要与级别 2 进行身份验证。但是,当用户将参数显式附加到登录请求(如 acr_values=1 )时,将使用级别 1。因此,如果客户端实际需要 2 级,则鼓励客户端检查 ID Token 中是否存在 acr 声明,并再次检查它是否包含请求的级别 2。
详情请查看 步骤验证和 官方 OIDC 规格。
12.1.4. 机密客户端凭证 复制链接链接已复制到粘贴板!
如果客户端的客户端身份验证设置为 ON,必须在 Credentials 选项卡下配置客户端的凭据。???
凭证标签页
Client Authenticator 下拉列表指定用于客户端的凭证类型。
客户端 ID 和 Secret
这个选择是默认设置。该 secret 会自动生成。如果需要,点 Regenerate 重新创建 secret。
签名的 JWT
已签名的 JWT 是"Signed Json Web Token"。
在选择此凭证类型时,还必须在标签 Keys 中为客户端生成私钥和证书。私钥将用于签署 JWT,而证书则供服务器用于验证签名。
keys 标签页
点 Generate new keys 按钮启动此过程。
生成密钥
- 选择要使用的归档格式。
- 输入 密钥密码。
- 输入 存储密码。
- 点 Generate。
当您生成密钥时,Red Hat build of Keycloak 将存储证书,并下载您的客户端的私钥和证书。
您还可以使用外部工具生成密钥,然后通过单击 Import Certificate 来导入客户端证书。
导入证书
- 选择证书的存档格式。
- 输入存储密码。
- 单击 Import File 来选择证书文件。
- 点 Import。
如果您点 Use JWKS URL,则需要导入证书。在这种情况下,您可以提供以 JWK 格式发布公钥的 URL。使用此选项时,如果密钥被改变,红帽构建的 Keycloak 会重新导入密钥。
如果您使用由红帽构建的 Keycloak 适配器保护的客户端,您可以使用此格式配置 JWKS URL,假设 https://myhost.com/myapp 是客户端应用程序的根 URL:
https://myhost.com/myapp/k_jwks
https://myhost.com/myapp/k_jwks
如需了解更多详细信息,请参阅 服务器开发人员指南。
使用客户端 Secret 签名的 JWT
如果选择了这个选项,您可以使用由客户端 secret 签名的 JWT,而不是私钥。
客户端机密将由客户端签名 JWT。
X509 证书
红帽构建的 Keycloak 将验证客户端是否在 TLS Handshake 中使用正确的 X509 证书。
X509 证书
验证器还使用配置的 regexp 验证表达式检查证书的 Subject DN 字段。对于某些用例,接受所有证书就足够了。在这种情况下,您可以使用 (external?) (?:$) 表达式。
红帽构建的 Keycloak 可以通过两种方式从请求获取客户端 ID:
-
查询中的
client_id参数(在 OAuth 2.0 规范的 2.2 节中规定)。 -
提供
client_id作为表单参数。
12.1.5. 客户端 Secret 轮转 复制链接链接已复制到粘贴板!
请注意,客户端 Secret 轮转支持正在开发中。以实验方式使用此功能。
对于具有 机密 客户端身份验证 红帽构建的 Keycloak 的客户端,支持通过客户端 策略 轮转客户端 secret 的功能。
客户端 secret 轮转策略提供了更高的安全性,以缓解问题,如 secret 泄漏。启用后,红帽构建的 Keycloak 支持每个客户端同时有两个活跃的 secret。策略根据以下设置管理轮转:
- Secret expiration: [seconds] - 当 secret 被轮转时,这是新 secret 的过期时间。添加到 secret 创建日期 中的数量(以秒为单位)。在策略执行时计算。
- 轮转 secret expiration: [seconds] - 当 secret 被轮转时,这个值是旧 secret 的剩余过期时间。这个值应该总是小于 Secret 过期。当值为 0 时,在客户端轮转过程中将立即删除旧 secret。添加到 secret 轮转日期 中的数量(以秒为单位)。在策略执行时计算。
- 更新期间轮转的剩余过期时间: [秒] - 更新动态客户端应执行客户端 secret 轮转时的时间。在策略执行时计算。
当发生客户端 secret 轮转时,会生成一个新的主 secret,旧的客户端主 secret 成为带有新的过期日期的二级 secret。
12.1.5.1. 客户端 secret 轮转的规则 复制链接链接已复制到粘贴板!
轮转不会自动发生,或通过后台进程进行。为了执行轮转,客户端上需要一个更新操作,通过 Regenerate Secret (在客户端凭证选项卡中或 Admin REST API)的功能,通过 Red Hat build of Keycloak Admin Console。在调用客户端更新操作时,secret 轮转会根据规则进行:
- 当 Secret 过期的 值小于当前日期时。
- 在动态客户端注册客户端更新请求时,如果更新 期间的 Remaining 过期时间 值与当前日期和 Secret 过期之间的周期匹配,客户端 secret 将自动轮转。
此外,管理员 REST API 可以随时强制进行客户端 secret 轮转。
在创建新客户端时,如果客户端 secret 轮转策略处于活跃状态,则会自动应用行为。
要将 secret 轮转行为应用到现有客户端,请在定义策略后更新该客户端,以便应用行为。
12.1.6. 创建 OIDC 客户端 Secret 轮转策略 复制链接链接已复制到粘贴板!
以下是定义 secret 轮转策略的示例:
流程
- 单击菜单中的 Realm Settings。
- 点 Client Policies 选项卡。
在 Profiles 页面上,单击 Create client profile。
创建配置集
- 为 Name 输入任何名称。
- 输入描述帮助您识别 描述 的配置文件的用途。
点 Save。
此操作会创建配置集,并可让您配置 executors。
点 Add executor 为这个配置集配置 executor。
创建配置集 executor
- 选择 Executor Type 的 secret-rotation。
- 为 Secret Expiration 输入每个 secret 的最长持续时间时间(以秒为单位)。
为 Rotated Secret Expiration 输入每个轮转 secret 的最长持续时间时间(以秒为单位)。
警告请记住,Rotated Secret Expiration 值必须始终小于 Secret Expiration。
- 输入时间(以秒为单位)后,任何更新操作都会为 Remain Expiration Time 更新客户端。
点击 Add。
在上例中:
- 每个 secret 都在一周内有效。
- 轮转的 secret 在两天后过期。
- 更新动态客户端的窗口在 secret 过期前一天开始。
- 返回到 Client Policies 选项卡。
- 点 Policies。
单击 Create client policy。
创建 Client Secret Rotation 策略
- 为 Name 输入任何名称。
- 输入描述,帮助您识别 描述 策略的用途。
点 Save。
此操作会创建策略,并可让您将策略与配置集关联。它还允许您配置策略执行的条件。
在 Conditions 下,点 Add condition。
创建 Client Secret Rotation Policy Condition
要将行为应用到所有机密客户端,请在 Condition Type 字段中选择 client-access-type
注意要应用到特定的客户端组,另一种方法是选择 Condition Type 字段中的 client-roles 类型。这样,您可以创建特定的角色,并为每个角色分配自定义轮转配置。
- 将机密 添加到 字段 Client Access Type 中。
- 点击 Add。
返回到策略设置,在 Client Profiles 下,单击 Add client profile,然后从列表中选择 Weekly Client Secret Rotation Profile,然后点 Add。
客户端 Secret 轮转策略
要将 secret 轮转行为应用到现有客户端,请按照以下步骤执行:
使用管理控制台
- 点菜单中的 Clients。
- 点客户端。
- 点 Credentials 选项卡。
- 点客户端 secret 的 Re-generate。
使用客户端 REST 服务可以通过两种方式执行:
- 通过客户端上的更新操作
- 通过重新生成客户端 secret 端点
12.1.7. 使用服务帐户 复制链接链接已复制到粘贴板!
每个 OIDC 客户端都有一个内置 服务帐户。使用 此服务帐户 获取访问令牌。
流程
来自访问令牌的角色是以下交集:
- 客户端的角色范围映射与从链接的客户端范围继承的角色范围映射合并。
- 服务帐户角色.
要调用的 REST URL 是 /realms/{realm-name}/protocol/openid-connect/token。此 URL 必须作为 POST 请求调用,并要求您使用请求发布客户端凭证。
默认情况下,客户端凭证由 Authorization: Basic 标头中的客户端的 clientId 和 clientSecret 表示,但您也可以使用签名的 JWT 断言或客户端身份验证的任何其他自定义机制验证客户端。
您还需要根据 OAuth2 规范将 grant_type 参数设置为 "client_credentials"。
例如,检索服务帐户的 POST 调用类似如下:
POST /realms/demo/protocol/openid-connect/token
Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
POST /realms/demo/protocol/openid-connect/token
Authorization: Basic cHJvZHVjdC1zYS1jbGllbnQ6cGFzc3dvcmQ=
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
响应类似于来自 OAuth 2.0 规范的访问令牌 响应。
默认仅返回访问令牌。不会返回刷新令牌,默认身份验证时不会在红帽构建的 Keycloak 端上创建用户会话。由于缺少刷新令牌,在访问令牌过期时需要重新进行身份验证。但是,这种情况并不意味着红帽构建的 Keycloak 服务器的额外开销,因为默认不会创建会话。
在这种情况下,不需要注销。但是,发布的访问令牌可以通过发送请求到 OAuth2 Revocation Endpoint 来撤销,如 OpenID Connect Endpoints 部分所述。
12.1.8. 受众支持 复制链接链接已复制到粘贴板!
通常,部署了红帽构建的 Keycloak 的环境由一组使用红帽构建的 Keycloak 进行身份验证 的机密 或 公共 客户端应用程序组成。
也可以使用 服务 ( OAuth 2 规范中的资源服务器 )为来自客户端应用程序的请求提供服务,并向这些应用提供资源。这些服务需要向它们发送访问令牌(Bearer 令牌)来验证请求。此令牌由 frontend 应用程序在登录到红帽 Keycloak 构建时获得。
在服务间信任较低的环境中,您可能会遇到这种情况:
- 前端客户端应用程序需要针对红帽构建的 Keycloak 进行身份验证。
- 红帽构建的 Keycloak 验证用户。
- 红帽构建的 Keycloak 向应用程序发布令牌。
- 应用使用令牌来调用不可信服务。
- 不受信任的服务将响应返回给应用程序。但是,它会保留应用令牌。
- 然后,不受信任的服务使用应用令牌调用可信服务。这会导致安全性问题,因为不受信任的服务可能会滥用令牌来代表客户端应用程序访问其他服务。
在服务间具有高度信任但信任低的环境中,这种情况不太可能。在某些环境中,此工作流可能正确,因为不受信任的服务可能需要从可信服务检索数据,才能将数据返回到原始客户端应用。
在服务间存在高级别信任时,有无限的受众很有用。否则,应限制受众。您可以限制受众,同时允许不受信任的服务从可信服务检索数据。在这种情况下,请确保不受信任的服务和可信服务被添加到令牌中。
为防止访问令牌滥用,请限制令牌的使用者并配置您的服务以验证令牌上的受众。流程将按如下方式更改:
- 前端应用程序针对红帽构建的 Keycloak 进行身份验证。
- 红帽构建的 Keycloak 验证用户。
红帽构建的 Keycloak 向应用程序发布令牌。应用程序知道它需要调用不受信任的服务,以便在发送到红帽构建的 Keycloak 的 身份验证请求中放置 scope=<untrusted service > (请参阅 Client Scopes 部分 以了解更多有关 scope 参数的详细信息)。
向应用程序发布的令牌包含对其受众中的不受信任的服务的引用("audience": [ "<untrusted service>" ],它声明客户端使用此访问令牌来调用不受信任的服务。
- 不受信任的服务调用带有令牌的可信服务。调用不成功,因为可信服务会检查令牌的受众,并发现其受众只针对不受信任的服务。这个行为是正常的,安全性不会被破坏。
如果客户端希望稍后调用可信服务,它必须通过使用 scope =<trusted service> 颁发 SSO 登录来获取另一个令牌。然后,返回的令牌将包含可信服务作为受众:
"audience": [ "<trusted service>" ]
"audience": [ "<trusted service>" ]
使用这个值调用 < trusted service>。
12.1.8.1. 设置 复制链接链接已复制到粘贴板!
设置受众检查时:
- 通过在 adapter 配置中添加标志 verify-token-audience,确保服务被配置为检查发送到它们的访问令牌的受众。详情请查看 适配器配置。
- 确保红帽构建的 Keycloak 发布的访问令牌包含所有必要的受众。可使用客户端角色添加受众,如 下一节 或硬编码所述。请参阅 硬编码的受众。
12.1.8.2. 自动添加受众 复制链接链接已复制到粘贴板!
在默认的客户端 范围角色 中定义 Audience Resolve 协议映射器。映射器会检查至少有一个客户端角色可用于当前令牌的客户端。然后,每个客户端的客户端 ID 会添加为受众,如果您的服务客户端依赖客户端角色时很有用。服务客户端通常是在没有启用任何流的情况下的客户端,这可能没有直接向其自身发布的令牌。它代表 OAuth 2 资源服务器。
例如,对于服务客户端和机密客户端,您可以使用为机密客户端发布的访问令牌来调用服务客户端 REST 服务。如果满足以下条件,服务客户端将自动作为受众添加到为机密客户端发布的访问令牌中:
- 服务客户端本身上定义了任何客户端角色。
- 目标用户至少分配了这些客户端角色之一。
- 机密客户端具有所分配的角色的角色范围映射。
如果要确保不自动添加 audience,请不要直接在机密客户端上配置角色范围映射。相反,您可以创建一个专用的客户端范围,其中包含专用客户端范围的客户端角色范围映射。
假设将客户端范围作为可选客户端范围添加到机密客户端,如果 scope=< trusted service > 参数明确请求,客户端角色和 audience 将添加到令牌中。
前端客户端本身不会自动添加到访问令牌受众中,因此允许在访问令牌和 ID 令牌之间轻松区分,因为访问令牌不包含作为受众发出令牌的客户端。
如果您需要客户端本身作为受众,请查看 硬编码的 audience 选项。但是,不建议使用与 frontend 和 REST 服务相同的客户端。
12.1.8.3. 硬编码的受众 复制链接链接已复制到粘贴板!
当您的服务依赖于域角色或根本不依赖于令牌中的角色时,使用硬编码的受众会很有用。硬编码的受众是一个协议映射程序,它会将指定服务客户端的客户端 ID 添加为令牌的受众。如果要使用与客户端 ID 不同的受众,您可以使用任何自定义值,如 URL。
您可以将协议映射程序直接添加到前端客户端。如果直接添加协议映射程序,将始终添加受众。
要对协议映射程序进行更多控制,您可以在专用客户端范围内创建协议映射器,该范围将称为 good-service。
受众协议映射器
- 在 good-service 客户端的客户端 详情选项卡中,您可以生成适配器配置,并确认 verify-token-audience 已设置为 true。如果您使用此配置,这个操作会强制适配器验证受众。
您需要确保机密客户端能够向其令牌中作为受众 提供良好的服务。
在机密客户端中:
- 点 Client Scopes 选项卡。
将 good-service 分配为可选(或默认)客户端范围。
如需了解更多详细信息 ,请参阅客户端范围链接部分。
- 您可以选择 评估客户端范围 并生成示例访问令牌。如果您将 good-service 指定为可选客户端范围时,如果您将 good-service 包含在 scope 参数中,则将添加到生成的访问令牌的受众中。
在机密客户端应用中,确保使用了 scope 参数。当您要签发用于访问 good-service 的令牌时,必须包含值 good-service。
请参阅:
- 如果您的应用程序使用 servlet 适配器,则 参数 forwarding 部分。
- 如果您的应用程序使用 javascript 适配器,JavaScript adapter.
默认情况下,Audience 和 Audience Resolve 协议映射程序都仅将受众添加到访问令牌中。ID Token 通常仅包含一个受众,即签发令牌的客户端 ID,这是 OpenID Connect 规格的要求。但是,访问令牌不一定具有客户端 ID,这是签发的令牌,除非使用者映射程序添加了它。