无法使用Admin REST Api在Keycloak中创建复合角色

时间:2019-07-29 18:07:46

标签: json rest keycloak

我正在尝试使用Admin REST API以编程方式在Keycloak 6.0.1系统中管理角色和组合。根据文档,这就是我要使用的:

https://www.keycloak.org/docs-api/6.0/rest-api/index.html#_roles_resource

马上,我的Keycloak API的基本URL似乎是:

https://example.com/auth/admin

而不是/auth,就像文档似乎建议的那样。如果我使用文档中指定的基本URL,则会得到404。通过检查通过浏览器管理安装时Kubernetes管理员页面的工作,我发现了这种备用URL结构。

无论如何,我现在都可以使用POST /{realm}/clients/{id}/roles端点成功创建角色。当我尝试使用带有POST /{realm}/clients/{id}/roles/{role-name}/composites的POST添加复合文件时,问题就开始了:

/auth/admin/realms/REDACTED/clients/546052d9-6ba1-483e-93a5-a5fda51505b8/roles/%5ECouponAttemptsLog%25Unowned%25Write/composites
authorization: Bearer REDACTED
Content-Type: application/json
Accept: */*
Content-Length: 217
User-Agent: node-fetch/1.0 (+https://github.com/bitinn/node-fetch)
Accept-Encoding: gzip,deflate
Connection: close
Host: REDACTED

{"roles":[{"name":"^CouponAttemptsLog/id%Unowned%Write"},{"name":"^CouponAttemptsLog/code%Unowned%Write"},{"name":"^CouponAttemptsLog/eventId%Unowned%Write"},{"name":"^CouponAttemptsLog/attemptedDate%Unowned%Write"}]}

Keycloak记录的错误消息是:

14:18:02,617 ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-4884) Uncaught server error: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token

...并且Keycloak返回500,没有文本。

据我所知,这与Keycloak 6 API文档中指定的预期请求形状匹配,我不知道可能导致这种反序列化失败的原因。仅出于for牛,我尝试将裸JSON数组作为正文发送,但没有任何改进。

我在做什么错?我了解到Keycloak出现的错误意味着它正在尝试将某些内容转换为ArrayList不能的内容,但我不知所措,无法确定原因和原因。

2 个答案:

答案 0 :(得分:1)

它需要一组角色对象。试试这个:

ValueError: Out shape is mismatched

看一眼代码,我认为您需要在名称上加上一个角色ID ...即使文档上说 [ { "name": "^CouponAttemptsLog/id%Unowned%Write" }, { "name": "^CouponAttemptsLog/code%Unowned%Write" }, { "name": "^CouponAttemptsLog/eventId%Unowned%Write" }, { "name": "^CouponAttemptsLog/attemptedDate%Unowned%Write" } ] 中的所有字段都是可选的。

答案 1 :(得分:0)

我不知道您是否解决了问题,但就我而言,在将角色分配给复合角色时,我需要同时使用idname。是的,需要在分配给复合角色之前创建“部分”角色。

   [
      {
         "id": UUID of created role
         "name": "^CouponAttemptsLog/id%Unowned%Write"
      }
   ]

我的表情像这样:

  1. 在循环中创建部分角色-Keycloak api返回标头中新角色的位置,因此您需要调用GET以获取角色的json
  2. {"id": UUID}推送到数组-甚至更好的{"id": UUID, "name": name }或整个角色的表示形式(调用composites id就足够了,但是在服务角色的情况下,您需要两者
  3. 创建复合角色
  4. 呼叫composites端点