探究keycloak的自定义token

503 阅读2分钟

背景

在项目开发中,需要keycloak的token返回手机字段,但是查看token的payload内容中却并没有相关字段。

过程

1

keycloak的token是可以通过Hutool提供的jwt工具进行解析的,简单代码如下

JWT jwt = JWTUtil.parseToken(token)

但是查看jwt的payload却并没有发现我们需要的phone字段(或相似字段)

2

搜索相关内容,看到资料1,十分有帮助。文章对于jwt payload中主要字段、自定义字段的说明还是十分清楚的。

但是,回到我的问题,我发现keycloak的客户端模板中是存在phone模板的,而且在相应的客户端中也有设置该模板,只是phone模板属于可选模板,如下图所示

image.png

3

按照资料1的说明,需要修改的是客户端模板,我在考虑是否是认证请求时添加个scope参数,使其包含phone,这个想法没有被顺利验证,虽然尝试使用google浏览器的“copy as fetch”功能,重发认证请求,但也许是操作问题,效果不佳。

而此时,同事的提醒让我注意到在keycloak客户端中除了“客户端模板”还有直接的“Mapper”。

而我知道mapper是从keycloak的user_attribute中获取相关用户的属性,而这个mapper页签,就是该客户端能够获取的属性。

实际上,这个思路是可行的。由于工程中用户是通过ldap同步写入keycloak的。默认的ldap联合认证建立的mapper是没有phone的,因此,创建关于phone的ldap mapper,以建立ldap中属性到keycloak中用户属性的关联。

在经过验证之后,返回的token已然出现需要的phone的字段。

结论

keycloak的自定义token方式看来很多,但是其核心无疑是对于user_attribute表的使用,而客户端模板和客户端映射是返回token的两个重要组件。

资料

  1. keycloak~JWT各字段说明及扩展字段的方法