对于任何到 Keycloak REST Api 的 POST 都会收到 400 消息,并显示未知错误

xbm*_*ono 0 keycloak keycloak-rest-api

例如,我想admin使用admin-cli客户端创建一个新客户端。

令牌生成工作正常:

POST /auth/realms/master/protocol/openid-connect/token
b'username=admin&password=admin&grant_type=password&client_id=admin-cli'
Run Code Online (Sandbox Code Playgroud)

使用该令牌我还可以执行一些查询,例如当我需要获取客户端的 ID 时:

GET /auth/admin/realms/master/clients?clientId=my-test-cli
H' Authorization: Bearer xyz
H' Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

但是,当我想创建新的客户端角色或新客户端时,我总是会收到400错误。我将 Keycloak 服务器中的日志级别更改为DEBUG,但除了看到表明令牌已成功创建的日志之外,没有任何用处。

POST /auth/admin/realms/master/clients/7534ac42-fe8b-4cde-b6c6-c385f4958e3b/roles
400 {"error":"unknown_error"}
Run Code Online (Sandbox Code Playgroud)

我正在使用与 JBoss Wildfly 容器一起运行的 Python v3.x 和 Keycloak v14.0.0。

看看admin用户,它似乎拥有所有角色,如admindefault-roles-mastercreate-realm并且我在列表中没有看到任何要分配的角色,因为它似乎拥有一切。对于客户来说也是如此admin-cli。这两个配置(admin user 和 admin-cli)是您第一次启动服务器时的默认配置。我是否需要任何额外的东西,例如创建新角色或其他东西才能使其正常工作?

我创建机密客户端的有效负载:

payload = {
    "name": "Some Name",
    "clientId": "some-name",
    "secret": "some-name-secret",
    "enabled": true,
    "publicClient": false,
    "authorizationServicesEnabled": true,
    "redirectUris" : ["/*"]
}
Run Code Online (Sandbox Code Playgroud)

xbm*_*ono 5

我想回答一下我的问题,这样每个有类似情况的人就不会遇到同样的问题。

事实证明,我发送的有效负载不正确,感谢@JanGaraj指出了这一点。但我在这里想回答的是如何找出请求正文应该是什么样子。

首先,不要看文档。在文档中,所有字段都是可选的,并且 URL 也不正确。

最简单的方法是在本地启动 Keycloak 服务器并在 Firefox 或 Chrome 中登录管理控制台,然后按F12打开Development Mode。然后您可以在那里看到所有请求/响应。

例如,如果您想了解如何更新角色,请转到Roles主菜单上的菜单项并选择角色并更新它。您可以看到PUT请求及其正文。这会告诉您需要传入什么内容以及传入哪个 URL。

提示一下,更新时不需要传递所有内容,通常只需传递 ID 和要更新的字段即可。