我正在尝试使用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不能的内容,但我不知所措,无法确定原因和原因。
答案 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)
我不知道您是否解决了问题,但就我而言,在将角色分配给复合角色时,我需要同时使用id
和name
。是的,需要在分配给复合角色之前创建“部分”角色。
[
{
"id": UUID of created role
"name": "^CouponAttemptsLog/id%Unowned%Write"
}
]
我的表情像这样:
GET
以获取角色的json {"id": UUID}
推送到数组-甚至更好的{"id": UUID, "name": name }
或整个角色的表示形式(调用composites
id
就足够了,但是在服务角色的情况下,您需要两者composites
端点