如何从Keycloak的JWT访问令牌中移除不需要的属性?
问题
默认情况下,Keycloak生成的令牌包含如下载荷:
{ "jti": "71ac4939-03cb-4ce2-b072-08fa7e1b7f37", "exp": 1560239903, "nbf": 0, "iat": 1560239843, "iss": "http://localhost:8080/auth/realms/master", "sub": "d3ea1306-f0f9-4b25-b7c5-e64dfbdf949e", "typ": "Bearer", "azp": "admin-cli", "auth_time": 0, "session_state": "0162e8c3-25b3-4fd9-8416-e28bd27b61bd", "acr": "1", "scope": "email profile", "email_verified": false, "preferred_username": "admin" }
我们可以使用protocol mapper添加自定义字段,但是否可以移除不需要的字段?例如不希望保留acr、email_verified、azp等字段。
解答
完全可以移除不需要的非核心字段,操作方法如下:
方法1:使用脚本映射器(全版本通用)
这是最灵活的方案,支持删除任意非核心字段:
- 进入你要配置的Keycloak客户端详情页,切换到「Mapper」标签页,点击新建映射器
- 「Mapper Type」选择「Script Mapper」,填写自定义映射器名称,勾选你要让配置生效的令牌类型(访问令牌/ID令牌按需勾选)
- 在脚本输入框中填入以下逻辑,不需要的字段直接调用removeClaim方法删除即可:
// 删除示例字段 token.removeClaim('acr') token.removeClaim('email_verified') token.removeClaim('azp') // 要删除其他字段继续追加对应语句即可
- 保存配置后重新申请令牌,对应字段就会从载荷中消失。
方法2:禁用内置映射器(适合预置字段)
对于email_verified这类由内置映射器生成的字段,可以直接找到对应的映射器关闭开关即可:
- 进入领域设置的「客户端作用域」,找到对应字段所属的作用域(比如email相关字段在email作用域下)
- 进入对应作用域的Mapper列表,找到生成目标字段的映射器,直接禁用即可,或者取消「添加到访问令牌」「添加到ID令牌」的勾选。
注意:
iss、exp、sub、iat这类属于JWT协议规定的必填核心字段,删除后会导致令牌无法被正常校验,不建议删除。
内容的提问来源于stack exchange,提问作者Sina Askarnejad
相关产品推荐
相关产品推荐

