You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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手动完成授权:

  1. 调用/auth/realms/{realm}/authentication-sessions获取当前CIBA会话ID。
  2. 调用/auth/realms/{realm}/clients/{client-id}/authz/authorization/approve,传入会话ID和用户信息完成授权。

注:此方式需处理会话状态同步,可靠性低于SPI扩展,仅适合临时场景。

内容的提问来源于stack exchange,提问作者Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:12:39