6.4. JavaScript プロバイダー
DPoP は テクノロジープレビュー であり、完全にはサポートされていません。デフォルトでは無効になっています。
有効にするには、--features=preview
または --features=dpop
を使用してサーバーを起動します。
Red Hat build of Keycloak には、管理者が特定の機能をカスタマイズできるように、ランタイム時にスクリプトを実行する機能があります。
- オーセンティケーター
- JavaScript ポリシー
- OpenID Connect Protocol Mapper
- SAML プロトコルマッパー
6.4.1. オーセンティケーター
認証スクリプトは、Authenticator#action(AuthenticationFlowContext)
から呼び出される Authenticator#authenticate(AuthenticationFlowContext)
action(..)
から呼び出される authenticate(..)
関数を少なくとも 1 つ提供する必要があります。
カスタム Authenticator
は、最低でも authenticate(..)
関数を提供する必要があります。コード内で javax.script.Bindings
スクリプトを使用できます。
script
-
スクリプトメタデータにアクセスするための
ScriptModel
realm
-
RealmModel
user
-
現在の
UserModel
。user
を使用できるのは、別のオーセンティケーターがユーザーアイデンティティーの確立に成功し、ユーザーを認証セッションに設定した後にトリガーされるように、スクリプトオーセンティケーターが認証フロー内で設定されている場合です。 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.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 Protocol Mapper
OpenID Connect Protocol Mapper スクリプトは、ID トークンやアクセストークンの内容を変更できる JavaScript スクリプトです。
コード内で javax.script.Bindings
スクリプトを使用できます。
user
-
現在の
UserModel
realm
-
RealmModel
token
-
現在の
IDToken
。ID トークン用にマッパーが設定されている場合にのみ使用できます。 tokenResponse
-
現在の
AccessTokenResponse
。アクセストークン用にマッパーが設定されている場合にのみ使用できます。 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
にマッピングするために使用できます。
6.4.3. スクリプトで JAR を作成してデプロイ
JAR ファイルは、.jar
拡張子を持つ通常の ZIP ファイルです。
Red Hat build of 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" } ] }
このファイルは、デプロイする別のタイプのスクリプトプロバイダーを参照する必要があります。
authenticators
OpenID Connect Script Authenticator 用。同じ JAR ファイルに 1 つまたは複数のオーセンティケーターを設定できます。
policies
Red Hat build of Keycloak Authorization Services を使用する場合の JavaScript ポリシー用。同じ JAR ファイルに 1 つまたは複数のポリシーを設定できます。
mappers
OpenID Connect Script Protocol Mapper 用。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
saml-mappers
SAML Script Protocol Mapper 用。同じ JAR ファイルに 1 つまたは複数のマッパーを設定できます。
JAR
ファイルのスクリプトファイルごとに、スクリプトファイルを特定のプロバイダータイプにマッピングする META-INF/keycloak-scripts.json
に対応するエントリーが必要です。そのためには、各エントリーに以下のプロパティーを指定する必要があります。
name
Red Hat build of Keycloak 管理コンソールでのスクリプト表示に使用するための分かりやすい名前。指定がない場合は、代わりにスクリプトファイルを使用します。
description
スクリプトファイルの意図をより適切に説明する任意のテキスト
fileName
スクリプトファイルの名前。このプロパティーは 必須 であり、JAR 内のファイルにマップする必要があります。
6.4.4. スクリプト JAR のデプロイ
記述子とデプロイするスクリプトを含む JAR ファイルを作成したら、その JAR を Red Hat build of Keycloak の providers/
ディレクトリーにコピーして、bin/kc.[sh|bat] build
を実行します。