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"
}
]
}
このファイルは、デプロイする別のタイプのスクリプトプロバイダーを参照する必要があります。
authenticatorsOpenID Connect スクリプトオーセンティケーターの場合。同じ JAR ファイルに 1 つまたは複数のオーセンティケーターを設定できます。
policiesAuthorization Services を使用する場合の JavaScript ポリシー向け同じ JAR ファイルに 1 つまたは複数のポリシーを設定できます。
mappersOpenID Connect Script Protocol Mapper 用。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
saml-mappersSAML スクリプトプロトコルマッパーの場合。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
JAR ファイルのスクリプトファイルごとに、スクリプトファイルを特定のプロバイダータイプにマッピングする META-INF/keycloak-scripts.json に対応するエントリーが必要です。そのためには、各エントリーに以下のプロパティーを指定する必要があります。
nameRed 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>