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] 构建。请注意,您还需要启用 脚本功能

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.