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 ( 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();
}

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] 构建

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.