6.5. JavaScript プロバイダー
Red Hat Single Sign-On には、管理者が特定の機能をカスタマイズできるように、ランタイム時にスクリプトを実行する機能があります。
- オーセンティケーター
- JavaScript ポリシー
- OpenID Connect Script Protocol Mapper
- SAML プロトコルマッパー
6.5.1. オーセンティケーター
認証スクリプトは、Authenticator#action(AuthenticationFlowContext)
から呼び出される Authenticator#authenticate(AuthenticationFlowContext)
action(..)
から呼び出される authenticate(..)
関数を少なくとも 1 つ提供する必要があります。
カスタム Authenticator
は、最低でも authenticate(..)
関数を提供する必要があります。コード内で javax.script.Bindings
スクリプトを使用できます。
script
-
スクリプトメタデータにアクセスするための
ScriptModel
realm
-
RealmModel
user
-
現行の
UserModel
session
-
アクティブな
KeycloakSession
authenticationSession
-
現在の
AuthenticationSessionModel
httpRequest
-
the current
org.jboss.resteasy.spi.HttpRequest
LOG
-
ScriptBasedAuthenticator
にスコープ指定されたorg.jboss.logging.Logger
authenticate(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.5.2. スクリプトで JAR を作成してデプロイ
JAR ファイルは、.jar
拡張子を持つ通常の ZIP ファイルです。
Red Hat Single Sign-On でスクリプトを利用できるようにするには、サーバーにスクリプトをデプロイする必要があります。そのため、以下の構造で 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" } ] }
このファイルは、デプロイする別のタイプのスクリプトプロバイダーを参照する必要があります。
authenticators
OpenID Connect スクリプトオーセンティケーターの場合。同じ JAR ファイルに 1 つまたは複数のオーセンティケーターを設定できます。
policies
Authorization Services を使用する場合の JavaScript ポリシー向け同じ JAR ファイルに 1 つまたは複数のポリシーを設定できます。
mappers
OpenID Connect Script Protocol Mapper 用。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
saml-mappers
SAML スクリプトプロトコルマッパーの場合。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
JAR
ファイルのスクリプトファイルごとに、スクリプトファイルを特定のプロバイダータイプにマッピングする META-INF/keycloak-scripts.json
に対応するエントリーが必要です。そのためには、各エントリーに以下のプロパティーを指定する必要があります。
name
Red Hat Single Sign-On 管理コンソールでのスクリプト表示に使用するための分かりやすい名前。指定がない場合は、代わりにスクリプトファイルを使用します。
description
スクリプトファイルの意図をより適切に説明する任意のテキスト
fileName
スクリプトファイルの名前。このプロパティーは 必須 であり、JAR 内のファイルにマップする必要があります。
6.5.3. スクリプト JAR のデプロイ
記述子とデプロイするスクリプトが含まれる JAR ファイルを追加したら、JAR を Red Hat Single Sign-On の standalone/deployments/
ディレクトリーにコピーする必要があります。
6.5.3.1. スクリプトエンジンの Java 15 以降へのデプロイ
スクリプトを実行するには、JavaScript プロバイダーは Java アプリケーションで JavaScript エンジンが利用可能である必要があります。Java 14 以降のバージョンには Nashorn JavaScript Engine が含まれます。Java 自体の一部として自動的に利用でき、JavaScript プロバイダーはデフォルトでこのスクリプトエンジンを使用できます。ただし、Java 15 以降のバージョンでは、スクリプトエンジンは Java 自体に含まれません。Red Hat Single Sign-On にはデフォルトでスクリプトエンジンがないため、サーバーに追加する必要があります。Java 15 以降のバージョンでは、スクリプトプロバイダーのデプロイ時に追加の手順が必要になります。ディストリビューションに任意のスクリプトエンジンを追加します。
任意のスクリプトエンジンを使用できます。ただし、テストされるのは JavaScript Engine のみです。以下の手順は、このエンジンが使用されていることを前提としています。
スクリプトエンジンをインストールするには、新しいモジュール nashorn-core を Red Hat Single Sign-On に追加します。サーバーが起動したら、KEYCLOAK_HOME/bin
ディレクトリーに以下のようなコマンドを実行できます。
export NASHORN_VERSION=15.3 wget https://repo1.maven.org/maven2/org/openjdk/nashorn/nashorn-core/$NASHORN_VERSION/nashorn-core-$NASHORN_VERSION.jar ./jboss-cli.sh -c --command="module add --module-root-dir=../modules/system/layers/keycloak/ --name=org.openjdk.nashorn.nashorn-core --resources=./nashorn-core-$NASHORN_VERSION.jar --dependencies=asm.asm,jdk.dynalink" rm nashorn-core-$NASHORN_VERSION.jar
プロバイダーを別のモジュールにインストールする場合は、デフォルトのスクリプトプロバイダーの設定プロパティー script-engine-module
を使用できます。たとえば、KEYCLOAK_HOME/standalone/configuration/standalone-*.xml
ファイルで以下を使用できます。
<spi name="scripting"> <provider name="default" enabled="true"> <properties> <property name="script-engine-module" value="org.graalvm.js.js-scriptengine"/> </properties> </provider> </spi>