6.4. JavaScript 提供程序
脚本 是技术预览,且不受支持。此功能默认为禁用。
使用-- features=preview
or-- features=scripts
启动服务器
Red Hat build of Keycloak 能够在运行时执行脚本,以便管理员能够自定义特定的功能:
- 身份验证器
- JavaScript 策略
- OpenID Connect 协议映射程序
- SAML 协议映射程序
6.4.1. 身份验证器
身份验证脚本必须至少提供以下功能之一:auth (..)
,它从 Authenticator"authenticate (AuthenticationFlowContext)
操作调用,它从 action (..)
Authenticator askaction (AuthenticationFlowContext)
调用。
自定义
验证器应至少提供身份验证 (..)
函数。您可以在代码中使用 javax.script.Bindings
脚本。
script
-
用于访问脚本元数据的
ScriptModel
realm
-
RealmModel
user
-
当前的
UserModel
。请注意,当脚本验证器以另一个验证器成功建立用户身份
后触发的身份验证流中配置时,用户就可用,并将用户设置为身份验证会话。 会话
-
活跃的
KeycloakSession
authenticationSession
-
当前
AuthenticationSessionModel
httpRequest
-
the current
org.jboss.resteasy.spi.HttpRequest
LOG
-
org.jboss.logging.Logger
范围为ScriptBasedAuthenticator
您可以从传递给 authentication (context )
参数中提取额外的上下文信息。
action (
函数的 contextcontext
)
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(); }
6.4.1.1. 在何处添加脚本验证器
脚本验证器的可能用途是在身份验证结束时进行一些检查。请注意,如果您希望使用身份 cookie 在 SSO 重新身份验证期间始终触发脚本验证器(即使是实例),您可能需要在身份验证流末尾将其添加为 REQUIRED,并将现有的验证器封装到单独的 REQUIRED 身份验证子流中。这是因为 REQUIRED 和 ALTERNATIVE 执行应该不在同一级别上。例如,身份验证流配置应如下所示:
- User-authentication-subflow REQUIRED -- Cookie ALTERNATIVE -- Identity-provider-redirect ALTERNATIVE ... - Your-Script-Authenticator REQUIRED
6.4.2. OpenID Connect 协议映射程序
OpenID Connect 协议映射程序脚本是 javascript 脚本,允许您更改 ID Token 和/或 访问令牌的内容。
您可以在代码中使用 javax.script.Bindings
脚本。
user
-
当前
UserModel
realm
-
RealmModel
token
-
当前的
IDToken
。只有在为 ID 令牌配置了映射程序时,它才可用。 tokenResponse
-
当前的
AccessTokenResponse
。只有在为访问令牌配置了映射程序时,它才可用。 userSession
-
active
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
中。
6.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
中对应的条目,用于将脚本文件映射到特定的提供程序类型。为此,您应该为每个条目提供以下属性:
名称
通过红帽构建的 Keycloak 管理控制台来显示脚本的友好名称。如果没有提供,则使用脚本文件的名称替代
description
更好地描述脚本文件计划的可选文本
fileName
脚本文件的名称。此属性 是必需的,应映射到 JAR 中的文件。
6.4.4. 部署脚本 JAR
有描述符和您要部署的脚本的 JAR 文件后,您只需要将 JAR 复制到红帽构建的 Keycloak 供应商/目录,然后运行
。
bin/
kc.[sh|bat] 构建