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

如何通过Keycloak PAR端点传递动态参数并写入access_token

实现Keycloak PAR端点传递动态参数并写入Access Token

要实现通过PAR(推送授权请求)端点传递动态自定义参数,并最终写入access_token,需要完成两个核心操作:让Keycloak在PAR阶段存储自定义参数,以及在Token生成时从存储的授权请求中读取参数并写入token。

操作步骤

1. 确保PAR请求的自定义参数被Keycloak存储

Keycloak默认会保存PAR请求中的标准OAuth2参数,自定义参数需按规范传递以确保被存储:

  • 发送PAR请求时,将动态参数additional_json以URL编码的JSON字符串形式放在表单参数中(或用application/json格式发送请求),示例参数:
    client_id=postman
    client_secret=your-client-secret
    response_type=code
    additional_json=%7B%22test%22%3A%22something%22%7D
    
  • 确认客户端配置中已开启Push Authorization Requests选项(在客户端Settings标签页的Advanced部分)。

2. 创建/修改Script Mapper读取PAR存储的参数并写入Token

替换你之前的Script Mapper代码为以下内容,实现从PAR存储的授权请求中读取自定义参数并写入token:

// 获取当前认证会话
var authSession = keycloakSession.getContext().getAuthenticationSession();
// 引入授权请求存储类
var AuthorizationRequestStore = Java.type("org.keycloak.services.clientregistration.policy.AuthorizationRequestStore");
var authRequestStore = keycloakSession.getProvider(AuthorizationRequestStore);

// 从认证会话中获取PAR返回的request_uri
var requestUri = authSession.getAuthNote("request_uri");
if (requestUri) {
    // 根据request_uri获取对应的授权请求记录
    var authRequest = authRequestStore.getByRequestUri(requestUri);
    if (authRequest) {
        // 提取自定义参数additional_json
        var additionalJsonStr = authRequest.getRequestParameters().getFirst("additional_json");
        if (additionalJsonStr) {
            try {
                // 解析JSON字符串
                var additionalJson = JSON.parse(additionalJsonStr);
                // 将解析后的所有键值对写入token自定义claims
                for (var key in additionalJson) {
                    token.setOtherClaims(key, additionalJson[key]);
                }
            } catch (e) {
                logger.error("解析additional_json参数失败: " + e.getMessage());
            }
        }
    }
}

3. 配置Script Mapper权限(如遇权限问题)

如果脚本提示访问API权限不足,需调整Keycloak的脚本权限配置:

  • 在standalone.xml(或keycloak.conf)中添加允许访问的类和属性:
    <subsystem xmlns="urn:jboss:domain:keycloak-server:1.1">
        <web-context>auth</web-context>
        <script-engine>
            <allowed-properties>
                <property>keycloakSession</property>
                <property>token</property>
                <property>logger</property>
            </allowed-properties>
            <allowed-classes>
                <class>org.keycloak.services.clientregistration.policy.AuthorizationRequestStore</class>
                <class>org.keycloak.models.AuthenticationSessionModel</class>
            </allowed-classes>
        </script-engine>
    </subsystem>
    

验证流程

  1. 向PAR端点发送携带additional_json参数的POST请求,获取request_uri;
  2. 通过request_uri调用授权端点获取授权码;
  3. 调用token端点获取access_token,解析后即可看到additional_json中的字段已写入token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:13:27