14.7. 客户端身份验证
当授权客户端需要发送后端请求时,它需要针对红帽构建的 Keycloak 服务器进行身份验证。默认情况下,可以通过三种方式对客户端进行身份验证:客户端 ID 和客户端机密、使用签名 JWT 的客户端身份验证,或者使用客户端机密通过签名 JWT 进行客户端身份验证。
14.7.1. 客户端 ID 和客户端 Secret 复制链接链接已复制到粘贴板!
这是 OAuth2 规范中描述的传统方法。客户端有一个 secret,需要对客户端和红帽构建的 Keycloak 服务器都已知。您可以在红帽构建的 Keycloak 管理控制台中为特定客户端生成 secret,然后将此 secret 粘贴到应用程序端的 keycloak.json 文件中:
"credentials": {
"secret": "19666a4f-32dd-4049-b082-684c74115f28"
}
"credentials": {
"secret": "19666a4f-32dd-4049-b082-684c74115f28"
}
14.7.2. 使用 Signed JWT 进行客户端身份验证 复制链接链接已复制到粘贴板!
这基于 RFC7523 规格。它以这种方式工作:
-
客户端必须具有私钥和证书。对于授权客户端,这可通过传统的
密钥存储文件提供,该文件可以在客户端应用的 classpath 上或文件系统上的某个位置使用。 -
在身份验证过程中,客户端会生成 JWT 令牌并使用其私钥进行签名,并将其发送到
client_assertion参数中特定请求中的 Keycloak 的红帽构建。 红帽构建的 Keycloak 必须有客户端的公钥或证书,以便它可以验证 JWT 上的签名。在 Red Hat build of Keycloak 中,您可以为客户端配置客户端凭证。首先,您可以选择
Signed JWT作为在管理控制台选项卡中验证客户端的方法。然后您可以在Keys选项卡中选择这些方法之一:-
配置红帽构建的 Keycloak 可下载客户端的公钥的 JWKS URL。这个选项是最灵活的,因为客户端可以随时轮转其密钥,红帽构建的 Keycloak 始终根据需要下载新密钥,而无需更改配置。换句话说,当看到由未知
kid(Key ID)签名的令牌时,Red Hat build of Keycloak 会下载新密钥。但是,您将需要在某种地方公开 JWKS 格式的公钥,以便供服务器使用。 - 上传客户端的公钥或证书,可以是 PEM 格式,可以是 JWK 格式,或从密钥存储上传。使用此选项时,公钥被硬编码,必须在客户端生成新的密钥对时更改。如果您没有自己的密钥存储可用,则甚至可以从红帽构建的 Keycloak 管理控制台生成自己的密钥存储。此选项是使用授权客户端的最简单。
-
配置红帽构建的 Keycloak 可下载客户端的公钥的 JWKS URL。这个选项是最灵活的,因为客户端可以随时轮转其密钥,红帽构建的 Keycloak 始终根据需要下载新密钥,而无需更改配置。换句话说,当看到由未知
要使用此方法设置,您需要在 keycloak.json 文件中编写类似如下的代码:
使用此配置时,密钥存储文件 keystore-client.jks 必须在应用的类路径中使用授权客户端。如果不使用前缀 classpath: 您可以指向运行客户端应用程序的文件系统上的任何文件。
14.7.3. 使用客户端 secret 通过 Signed JWT 进行身份验证 复制链接链接已复制到粘贴板!
这与带有 Signed JWT 的客户端身份验证相同,但使用客户端 secret 而不是私钥和证书。
客户端有一个 secret,需要使用授权客户端和红帽构建的 Keycloak 服务器对应用程序进行已知。您可以选择 Signed JWT with Client Secret 作为在 Admin Console 的 Credentials 选项卡中验证客户端的方法,然后将此 secret 粘贴到应用程序端的 keycloak.json 文件中:
"algorithm"字段使用 Client Secret 指定 Signed JWT 的算法。它需要是以下值之一:HS256、HS384 和 HS512。详情请参阅 JSON Web 算法(JWA)。
此 "algorithm" 字段是可选的;如果 keycloak.json 文件中不存在 "algorithm" 字段,则会自动应用 HS256。
14.7.4. 添加您自己的客户端验证方法 复制链接链接已复制到粘贴板!
您还可以添加自己的客户端验证方法。您需要实施客户端和服务器端提供商。如需了解更多详细信息,请参阅 服务器 开发人员指南中的 身份验证 SPI 部分。