Пользовательский скрипт аутентификатора Keycloak - как получить токен доступа или внешний idp токен пользователя в контексте скрипта? - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь реализовать сценарий выполнения Authenticator в Keycloak 6.0.X, который извлекает внешний IDP-токен для пользователя и преобразует его перед добавлением обратно в токен jwt / access. Сценарий выполняется как выполнение «Post Login Flow».

Пока я не могу получить доступ ни к токену доступа пользователя, ни к внешнему токену IDP непосредственно в скрипте.

    /*
    * Template for JavaScript based authenticator's.
    * See org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticatorFactory
    */

    // import enum for error lookup
    AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");

    /**
    * An example authenticate function.
    *
    * The following variables are available for convenience:
    * user - current user {@see org.keycloak.models.UserModel}
    * realm - current realm {@see org.keycloak.models.RealmModel}
    * session - current KeycloakSession {@see org.keycloak.models.KeycloakSession}
    * httpRequest - current HttpRequest {@see org.jboss.resteasy.spi.HttpRequest}
    * script - current script {@see org.keycloak.models.ScriptModel}
    * authenticationSession - current authentication session {@see org.keycloak.sessions.AuthenticationSessionModel}
    * LOG - current logger {@see org.jboss.logging.Logger}
    *
    * You one can extract current http request headers via:
    * httpRequest.getHttpHeaders().getHeaderString("Forwarded")
    *
    * @param context {@see org.keycloak.authentication.AuthenticationFlowContext}
    */

function authenticate(context) {

    var username = user ? user.username : "anonymous";
    LOG.info(script.name + " trace auth for: " + username);

    var federatedIdentity = session.users().getFederatedIdentities(user, realm);
    LOG.info(script.name + " federatedIdentity= " + federatedIdentity);

    var token = federatedIdentity.getToken();

    var authShouldFail = false;
    if (authShouldFail) {

        context.failure(AuthenticationFlowError.INVALID_USER);
        return;
    }

    context.success();
}

Я могу успешно получить FederatedIdentityModel, который согласно документам должен иметь метод getToken (), однако сценарий завершается неудачно при вызове этого метода со следующей ошибкой:

TypeError: federatedIdentity.getToken не является функцией в eval

Я пытался использовать Object.getOwnPropertyNames(session), чтобы увидеть, какие поля и методы доступны для этих переменных, но получается наши они не Javascript объекты вообще ..

TypeError: org.keycloak.services. DefaultKeycloakSession@2f2807cd не является объектом в eval

Больше копать показывает:

session instanceof Object возвращается false в то время как typeof session возвращается 'object'

Любые идеи или вдохновение будут высоко ценится!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...