5.4. JavaScript 供应商
红帽构建的 Keycloak 能够在运行时执行脚本,以便管理员能够自定义特定功能:
- 身份验证器
- JavaScript 策略
- OpenID Connect Protocol Mapper
- SAML 协议映射程序
5.4.1. 身份验证器
身份验证脚本必须至少提供以下功能之一: authentication (..)
,从 Authenticator#authenticate (AuthenticationFlowContext)
操作(..
)调用,它从 Authenticator#action (AuthenticationFlowContext)
调用。
自定义 身份验证器
应至少提供身份验证 (..)
函数。您可以使用代码中的 javax.script.Bindings
脚本。
script
-
用于访问脚本
元数据的脚本模型 realm
-
RealmModel
user
-
当前
UserModel
。请注意,如果在身份验证流中配置了脚本验证器时,用户就可以在另一个验证器成功下触发,并将该用户设置为身份验证会话。 会话
-
活跃的
KeycloakSession
authenticationSession
-
当前的
身份验证SessionModel
httpRequest
-
当前
org.jboss.resteasy.spi.HttpRequest
LOG
-
org.jboss.logging.Logger
范围为ScriptBasedAuthenticator
您可以从传递给 authentication ( context
)
函数的上下文参数中提取额外的上下文信息。
操作(context)
AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError"); function authenticate(context) { LOG.info(script.name + " --> trace auth for: " + user.username); if ( user.username === "tester" && user.getAttribute("someAttribute") && user.getAttribute("someAttribute").contains("someValue")) { context.failure(AuthenticationFlowError.INVALID_USER); return; } context.success(); }
5.4.1.1. 在什么位置添加脚本验证器
可以使用脚本验证器是在身份验证结束时进行一些检查。请注意,如果您希望脚本验证器总是被触发(即使在使用身份 Cookie 的 SSO 重新身份验证过程中为实例),您可能需要将它添加为身份验证流末尾的 REQUIRED,并将现有的验证器封装到单独的 REQUIRED 身份验证子流中。这需要是因为 REQUIRED 和 ALTERNATIVE 执行不应处于相同的级别。例如,身份验证流配置应如下所示:
- User-authentication-subflow REQUIRED -- Cookie ALTERNATIVE -- Identity-provider-redirect ALTERNATIVE ... - Your-Script-Authenticator REQUIRED
5.4.2. OpenID Connect Protocol Mapper
OpenID Connect 协议映射程序脚本是 javascript 脚本,允许您更改 ID 令牌和/或访问令牌的内容。
您可以使用代码中的 javax.script.Bindings
脚本。
user
-
当前
UserModel
realm
-
RealmModel
token
-
当前
IDToken
。只有在为 ID 令牌配置了映射程序时,它才可用。 tokenResponse
-
当前
AccessTokenResponse
。只有在为 Access 令牌配置了映射程序时,它才可用。 userSession
-
活跃的
UserSessionModel
keycloakSession
-
活跃的
KeycloakSession
脚本的导出将用作令牌声明的值。
// prints can be used to log information for debug purpose. print("STARTING CUSTOM MAPPER"); var inputRequest = keycloakSession.getContext().getHttpRequest(); var params = inputRequest.getDecodedFormParameters(); var output = params.getFirst("user_input"); exports = output;
以上脚本允许从授权请求中检索 user_input
。这可用于映射程序中配置的 Token Claim Name
。
5.4.3. 使用要部署的脚本创建一个 JAR
JAR 文件是带有 .jar
扩展名的常规 ZIP 文件。
为了使您的脚本可供红帽构建的 Keycloak 使用,您需要将它们部署到服务器。为此,您应该创建一个具有以下结构的 JAR
文件:
META-INF/keycloak-scripts.json my-script-authenticator.js my-script-policy.js my-script-mapper.js
META-INF/keycloak-scripts.json
是一个文件描述符,提供有关您要部署脚本的元数据信息。它是具有以下结构的 JSON 文件:
{ "authenticators": [ { "name": "My Authenticator", "fileName": "my-script-authenticator.js", "description": "My Authenticator from a JS file" } ], "policies": [ { "name": "My Policy", "fileName": "my-script-policy.js", "description": "My Policy from a JS file" } ], "mappers": [ { "name": "My Mapper", "fileName": "my-script-mapper.js", "description": "My Mapper from a JS file" } ], "saml-mappers": [ { "name": "My Mapper", "fileName": "my-script-mapper.js", "description": "My Mapper from a JS file" } ] }
此文件应该引用您要部署的不同类型的脚本供应商:
身份验证器
对于 OpenID Connect 脚本身份验证器。同一 JAR 文件中可以有一个或多个验证器
policies
对于使用红帽构建的 Keycloak 授权服务时的 JavaScript 策略。同一 JAR 文件中可以有一个或多个策略
Mappers
对于 OpenID Connect 脚本协议映射程序。同一 JAR 文件中可以有一个或多个映射程序
saml-mappers
对于 SAML 脚本协议映射程序。同一 JAR 文件中可以有一个或多个映射程序
对于 JAR
文件中的每个脚本文件,您需要在 META-INF/keycloak-scripts.json
中有一个对应的条目,将脚本文件映射到特定的提供程序类型。为此,您应该为每个条目提供以下属性:
name
用于通过红帽构建的 Keycloak 管理控制台显示脚本的友好名称。如果没有提供,则使用脚本文件的名称
description
更好的可选文本,它描述了脚本文件的预期
fileName
脚本文件的名称。此属性 是必需的,应映射到 JAR 中的文件。
5.4.4. 部署脚本 JAR
您有一个带有描述符和您要部署的脚本的 JAR 文件后,您只需要将 JAR 复制到 Keycloak 提供程序/目录的红帽构建中,然后运行
。请注意,您还需要启用 bin/
kc.[sh|bat] 构建脚本功能
。