使用 node.js 的 Keycloak Rest API

Posted

技术标签:

【中文标题】使用 node.js 的 Keycloak Rest API【英文标题】:Keyclok Rest API using node.js 【发布时间】:2021-02-09 18:39:59 【问题描述】:

我试图为 keyclok 应用程序编写一个 crud 函数。我能够获取令牌、使用令牌并获取用户列表但不能创建用户 如果有人可以帮助我,那对我很有帮助

创建用户列表(无效)

function CreateKCUser(accessToken) 
 let url = `http://localhost:8080/auth/admin/realms/msportal/users`;
  return axios_instance.post(url,
    
      headers: 
        "content-type": "application/json",
        "authorization": `Bearer $accessToken`
      ,
      data: 
        "firstName": "First",
        "lastName": "Last",
        "email":"test@test.com",
        "enabled":"true", 
        "username":"TEST-USER"
      ).then(function (response) 
        console.log('User Created');
    )
    .catch(function (error) 
      console.log('Error on Creation');
    );

获取用户列表(工作)

function GetKCUser(email, accessToken) 
  let url = `http://localhost:8080/auth/admin/realms/msportal/users?email=$email`;
  return axios_instance.get(url,
    
      headers: 
        "content-type": "application/json",
        "accept": "application/json",
        "authorization": `Bearer $accessToken`
      
    );

功能(令牌,让用户工作,除了用户创建)

http.createServer(function Test() 
  getAccessToken().then(function (response) 
    console.log('access_token=' + response.data.access_token);
    GetKCUser("shafeenes@gmail.com", response.data.access_token).then((resp) => 
      console.log(resp.data);
    );
    CreateKCUser(response.data.access_token).then((resp) => 
      console.log(resp);

    );

  ).catch(function (error) 
    // handle error
    console.log(error);
  )
    .then(function () 
      // always executed
    );;


).listen(8084);

【问题讨论】:

恕我直言,您正在重新发明***。我会使用github.com/keycloak/keycloak-nodejs-admin-client - 它实现了大多数 Keycloak Admin REST api 调用。当然,使用过的用户必须具有适当的用户/客户端权限。您可能拥有查看用户的权限,但没有创建用户的权限。 【参考方案1】:

您应该首先以管理员身份获取访问令牌,然后使用该令牌创建用户,

curl --location --request POST 'http://localhost:8080/auth/admin/realms/appsdeveloperblog/users' \
 --header 'Content-Type: application/json' \
 --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJFY2dlX3Y0c09fZUZ0TnhqYWJjT19QLTBhQ3p6S2VfMW02OU5mRjlBc1VzIn0.eyJleHAiOjE1OTI1Njc4OTEsImlhdCI6MTU5MjU2NzgzMSwianRpIjoiNjJiMWRlODEtNTBhMS00NzA2LWFmN2MtYzhhZTc1YTg1OTJhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL21hc3RlciIsInN1YiI6IjNmYjc1YTM4LTA4NjctNGZlYi04ZTBlLWYzMTkxZTZlODZlMSIsInR5cCI6IkJlYXJlciIsImF6cCI6ImFkbWluLWNsaSIsInNlc3Npb25fc3RhdGUiOiJhMDMwNGNiMS0xMzViLTQzODItYjYwMi0xNjNmNzgzYWNlN2IiLCJhY3IiOiIxIiwic2NvcGUiOiJlbWFpbCBwcm9maWxlIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbjIifQ.G9-OiyrGWk8cY4S3Ho255Y_euk_gTKDgYmGmU8RPBSeBNtFb_A68tuPFJxFKbzhZ1lipKJCXQsHbStoihvXAmmRsKzud5hDIvvnrD7CcVxAIpbd2wV5i6mB2wVLocV0_FCrE0-DNi_GPAKnazjFiVu3TxxM2L8Zsw7PHN9sb8Ux_lRvAFyNY5bT7NTbmEmt6LsO2An7iTZdBLScK9Lk9ZW8_0WG4eLMy9fatrpVV3MXhINW56gZD8WsWISY0m-cbIftDreZ1f2lzIjMGfkDrgCjy-VZjeIpbmffN-YGrUVywziymBRwA7FFLAxcf6jS5548HVxxKeMPIvNEfDG7eWw' \
 --data-raw '"firstName":"Sergey","lastName":"Kargopolov", "email":"test@test.com", "enabled":"true", "username":"app-user"'

来源:https://www.appsdeveloperblog.com/keycloak-rest-api-create-a-new-user/

【讨论】:

是的,我已经以管理员身份获取令牌,并且我能够获取用户列表但不能创建用户 我不明白,这是什么错误?您可以调整代码以包含令牌和新用户的有效负载 我已经更新了我的代码,你可以检查一下。我可以使用客户端密码检索令牌,然后显示所有用户,但我无法使用相同的令牌在我的列表中创建用户【参考方案2】:

大家好,我已经用另一种形式重新编写了代码,这对我有用,我可以创建用户

function CreateKCUser(accessToken) 
  return axios(
    method: 'post',
    url,
    data: 
      username,
      email,
      enabled
    ,
    headers: 
      'Authorization': `Bearer $accessToken`
    

  )
    .then(function (response) 
      console.log("User created!!");
    )
    .catch(function (error) 
      console.log("Error User exist!!!");
    );

【讨论】:

以上是关于使用 node.js 的 Keycloak Rest API的主要内容,如果未能解决你的问题,请参考以下文章

Node.js API 受 Keycloak 保护,访问类型为“仅承载”

Keycloak node.js 适配器不会在注销时使 connect.sid 会话 cookie 无效

如果 keycloak 会话过期,我如何重定向到登录页面?

成功登录后的 Node.js Express 无限重定向循环

res.sendFile 不是 Node.js 的函数

Node.js - 会话不会通过 res.redirect() 持续存在