Я пытаюсь реализовать сценарий выполнения 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'
Любые идеи или вдохновение будут высоко ценится!