如何在 SPI 中获取身份验证令牌?

问题描述 投票:0回答:1

我目前正在为 Keycloak 开发服务提供商接口 (SPI),我面临着一个挑战,希望有人可以帮助我。

我需要将 Keycloak 授权令牌发送到外部服务,将其交换为另一个令牌,然后将此新令牌附加到 cookie 或将其包含为自定义声明。

在哪里以及如何访问 Keycloak SPI 中的令牌并将其发送到外部服务?我可以在哪个阶段或方法执行此操作以确保令牌可用?

我尝试过的:

自定义声明: 我尝试使用自定义声明来检索令牌,但无法获取 JWT 形式的令牌。

认证流程: 我还尝试将此操作作为身份验证流程的一部分执行,但失败了。我怀疑这是因为此时令牌尚未生成。

java jwt keycloak keycloak-spi token-exchange
1个回答
0
投票

也许您可以将 KeycloakSession 对象传递到 SPI 并通过 KeycloakSession.tokens() 检索令牌

org.keycloak.models.KeycloakSession#tokens

public class MyCustomListenerProviderFactory implements EventListenerProviderFactory {

    @Override
    public EventListenerProvider create(KeycloakSession keycloakSession) {
        return new MyCustomListenerProvider(keycloakSession);
    }

    @Override
    public void init(Config.Scope scope) {
    }

    @Override
    public void postInit(KeycloakSessionFactory keycloakSessionFactory) {}

    @Override
    public void close() {}

    @Override
    public String getId() {
        return "my-custom";
    }
}

public class MyCustomListenerProvider implements EventListenerProvider {

    private final KeycloakSession session;
    private final RealmProvider realmProvider;

    public MyCustomListenerProvider(KeycloakSession session) {
        this.session = session;
        this.realmProvider = session.realms();
    }

    @Override
    public void onEvent(Event event) {
        var eventType = event.getType();
        logger.tracef("Event type: " + eventType);
        if (EventType.LOGIN.equals(eventType) || EventType.CODE_TO_TOKEN.equals(eventType)) {
            var realm = session.realms().getRealm(event.getRealmId());
            var user = this.session.users().getUserById(realm, event.getUserId());
        }
    }

    @Override
    public void close() {
    }

    @Override
    public void onEvent(AdminEvent adminEvent, boolean b) {}

}

© www.soinside.com 2019 - 2024. All rights reserved.