Nest.js-使用keycloak admin api

429 阅读2分钟

由于手上有个后台管理项目,是用keycloak做的接口权限控制,后台的用户、角色、资源等都是由keycloak进行控制的,最近碰到这样一个需求,需要在下拉框中显示某个角色下的所有用户。做的过程中也遇到一些坑,琢磨了一会,在此记录一下。

首先要获取角色下的用户,则必须使用keycloak的admin api。而调用该api的关键,则是需要获取访问api所需的token。而获取token上需要调用这个接口

https://localhost:8080/auth/realms/master/protocol/openid-connect/token
// 接口参数
{
  'username': '你的用户',
  'password': '你的密码',
  'grant_type': 'password', // 固定的
  'client_id': 'admin-cli' // 这两个是固定的
}

image.png

这里面有几个注意点,我当时理解错了,整了半天。

  1. auth/realms/master/protocol/openid-connect/tokenrealms后面是master,即使你使用的realName不是master,这个地方也是master
  2. 传参中的client_idadmin-cli也是固定的,而不是你对应项目的那个client_id,之前因为把这填错了,导致一直有问题
  3. 而账户密码,就是你登录keycloak console的账号密码了。

不过这个是通过自己调接口获取的,由于后端是使用的Nest.js,找到一个nestjs-keycloak-admin。刚开始还挺高兴,后面就傻眼了。

  • Due to @keycloak/keycloak-admin-client package, nestjs-keycloak-admin can't support CommonJS at the moment. The team behind keycloak-admin-client made the decision to have a breaking change and support CommonJS. Please refer to this Github issue for more information about their decision-making process.

意思是由于@keycloak/keycloak-admin-client的限制,不支持CommonJs, 但是运行Nest.js就直接报错了,因为运行的dist/main.js中的引入都是使用required进行引入的,而使用nestjs-keycloak-admin必须使用import`进行引入,尝试多次方式无果,遂放弃。

而直接使用这个库也是同样的原因@keycloak/keycloak-admin-client

Uncaught NodeError Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: F:\MyProj\node_modules\@keycloak\keycloak-admin-client\lib\index.js require() of ES modules is not supported.

本来都放弃了,直接使用Axios去调用对应接口的方式来实现,本来代码都写完了,也实现了需求,但是代码看着实现的不太得劲。回家后又研究了下,重要找到一篇文章说,只要把@keycloak/keycloak-admin-client的版本降为18.x,这个报错就消失了。剩下的只需要照着它对应的readme对着写就行,文档写得还挺详细。开心😊