6.5. JavaScript 공급자
Red Hat Single Sign-On에서는 관리자가 특정 기능을 사용자 지정할 수 있도록 런타임 중 스크립트를 실행할 수 있습니다.
- Authenticator
- JavaScript Policy
- OpenID Connect 프로토콜 맵퍼
- SAML 프로토콜 맵퍼
6.5.1. Authenticator
인증 스크립트는 다음 기능 중 하나를 제공해야 합니다. authenticate(..)
..은 Authenticator#authenticate(AuthenticationFlowContext)
작업(...)
에서 호출되며 Authenticator#action(AuthenticationFlowContext)
에서 호출됩니다.
사용자 정의 Authenticator
는 최소한 authenticate(..)
함수를 제공해야 합니다. 코드 내에서 javax.script.Bindings
스크립트를 사용할 수 있습니다.
script
-
스크립트 메타데이터에 액세스하기 위한
ScriptModel
realm
-
제품
상세 정보
user
-
현재
UserModel
세션
-
활성
KeycloakSession
authenticationSession
-
현재
AuthenticationSessionModel
httpRequest
-
the current
org.jboss.resteasy.spi.HttpRequest
LOG
-
org.jboss.logging.Logger
를ScriptBasedAuthenticator
로 지정
authenticate(context)
action(
함수에 전달된 컨텍스트 인수에서 추가 컨텍스트 정보를 추출할 수 있습니다.
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 스크립트 Authenticator의 경우. 동일한 JAR 파일에 하나 또는 여러 개의 인증자가 있을 수 있습니다.
Policies
Red Hat Single Sign-On 권한 부여 서비스를 사용할 때 JavaScript 정책의 경우 동일한 JAR 파일에 하나 이상의 정책을 가질 수 있습니다.
매퍼
OpenID Connect 스크립트 프로토콜 맵퍼의 경우. 동일한 JAR 파일에 하나 또는 여러 개의 매퍼가 있을 수 있습니다.
SAML-mappers
SAML 스크립트 프로토콜 맵퍼의 경우. 동일한 JAR 파일에 하나 또는 여러 개의 매퍼가 있을 수 있습니다.
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 독립 실행형/deployments/
디렉터리에 복사하면 됩니다.
6.5.3.1. Java 15 이상에 스크립트 엔진 배포
스크립트를 실행하려면 JavaScript 공급자에게 Java 애플리케이션에서 JavaScript 엔진을 사용할 수 있어야 합니다. Java 14 이하 버전에는 Nashorn JavaScript 엔진이 포함되어 있습니다. Java 자체의 일부로 자동으로 사용할 수 있으며 JavaScript 공급자는 기본적으로 이 스크립트 엔진을 사용할 수 있습니다. 그러나 Java 15 이상 버전의 경우 스크립트 엔진은 Java 자체의 일부가 아닙니다. Red Hat Single Sign-On에는 기본적으로 스크립트 엔진이 없으므로 서버에 추가해야 합니다. Java 15 이상 버전에서는 스크립트 공급자를 배포할 때 추가 단계가 필요합니다 - 배포에 선택한 스크립트 엔진을 추가합니다.
스크립트 엔진을 사용할 수 있습니다. 그러나 Nashorn JavaScript 엔진 만 테스트합니다. 다음 단계에서는 이 엔진을 사용하는 것으로 가정합니다.
새 모듈 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>