我目前正在为 Keycloak 开发服务提供商接口 (SPI),我面临着一个挑战,希望有人可以帮助我。
目标: 我需要将 Keycloak 授权令牌发送到外部服务,将其交换为另一个令牌,然后将此新令牌附加到 cookie 或将其包含为自定义声明。
我的问题: 在哪里以及如何访问 Keycloak SPI 中的令牌并将其发送到外部服务?我可以在哪个阶段或方法执行此操作以确保令牌可用?
任何指导、代码片段或文档参考将不胜感激!
我尝试过的:
自定义声明: 我尝试使用自定义声明来检索令牌,但无法获取 JWT 形式的令牌。
认证流程: 我还尝试将此操作作为身份验证流程的一部分执行,但失败了。我怀疑这是因为此时令牌尚未生成。
也许您可以将 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) {}
}