Keycloak 26.X.X版本CIBA无同意流程实现问题求助
Keycloak 26.X.X CIBA 无用户同意/通知的自动授权实现方案
问题根源分析
authorization_pending 错误说明CIBA流程卡在了授权批准环节:你实现的AuthenticationChannelProvider仅完成了通道请求的响应,但Keycloak仍在等待用户的授权确认动作。要跳过用户交互,需同时处理认证会话完成和自动授权批准两个环节。
核心解决方案:扩展SPI实现自动授权
1. 完善AuthenticationChannelProvider实现
确保通道请求返回true的同时,完成认证会话的标记,告知Keycloak用户已完成认证:
@Override public boolean requestAuthentication(AuthenticationChannelContext context) { AuthenticationSessionModel authSession = context.getAuthenticationSession(); RealmModel realm = context.getRealm(); // 此处替换为你的自动用户认证逻辑(比如从后台系统获取用户) UserModel autoUser = session.users().getUserByUsername(realm, "target-user-id"); // 标记会话为已认证 authSession.setAuthenticatedUser(autoUser); authSession.setAuthNote(AuthenticationManager.SESSION_AUTHENTICATED, "true"); AuthenticationManager.authenticationSuccessful(session, authSession, true); return true; }
2. 自定义AuthorizationApprovalProvider SPI
Keycloak默认需要用户手动批准授权,通过扩展该SPI可直接跳过此步骤:
实现Provider类
package com.yourorg.keycloak.spi; import org.keycloak.models.KeycloakSession; import org.keycloak.services.clientpolicy.context.AuthorizationApprovalContext; import org.keycloak.services.clientpolicy.spi.AuthorizationApprovalProvider; public class AutoApprovalAuthorizationProvider implements AuthorizationApprovalProvider { private final KeycloakSession session; public AutoApprovalAuthorizationProvider(KeycloakSession session) { this.session = session; } @Override public boolean isApproved(AuthorizationApprovalContext context) { // 可添加额外校验:仅允许指定CIBA客户端跳过授权 String targetClientId = "your-ciba-client-id"; if (targetClientId.equals(context.getClient().getClientId())) { return true; } // 其他客户端保留默认授权逻辑 return false; } @Override public void close() { // 空实现即可 } }
实现Provider工厂类
package com.yourorg.keycloak.spi; import org.keycloak.models.KeycloakSession; import org.keycloak.services.clientpolicy.spi.AuthorizationApprovalProvider; import org.keycloak.services.clientpolicy.spi.AuthorizationApprovalProviderFactory; public class AutoApprovalAuthorizationProviderFactory implements AuthorizationApprovalProviderFactory { @Override public AuthorizationApprovalProvider create(KeycloakSession session) { return new AutoApprovalAuthorizationProvider(session); } @Override public String getId() { return "auto-approval-ciba-provider"; // 唯一标识,用于控制台配置 } }
3. 注册并启用SPI
- 在项目的
META-INF/services/目录下创建文件org.keycloak.services.clientpolicy.spi.AuthorizationApprovalProviderFactory,内容为:com.yourorg.keycloak.spi.AutoApprovalAuthorizationProviderFactory - 将打包后的jar放入Keycloak的
providers/目录,重启Keycloak。 - 登录Keycloak控制台,进入目标CIBA客户端的Client Policies,添加新策略并选择你的
auto-approval-ciba-provider作为授权批准方式。
替代方案:Admin API手动触发授权
若不想扩展SPI,可在调用CIBA的auth接口后,通过Keycloak Admin API手动完成授权:
- 调用
/auth/realms/{realm}/authentication-sessions获取当前CIBA会话ID。 - 调用
/auth/realms/{realm}/clients/{client-id}/authz/authorization/approve,传入会话ID和用户信息完成授权。
注:此方式需处理会话状态同步,可靠性低于SPI扩展,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Fernando
相关产品推荐
相关产品推荐

