如何通过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>
验证流程
- 向PAR端点发送携带
additional_json参数的POST请求,获取request_uri; - 通过
request_uri调用授权端点获取授权码; - 调用token端点获取access_token,解析后即可看到
additional_json中的字段已写入token。
内容的提问来源于stack exchange,提问作者Ventrue
相关产品推荐
相关产品推荐

