首页 > 解决方案 > 对于 Keycloak REST Api 的任何 POST,获取 400 并带有消息 unknown_error

问题描述

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

令牌生成工作正常:

POST /auth/realms/master/protocol/openid-connect/token
b'username=admin&password=admin&grant_type=password&client_id=admin-cli'

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

GET /auth/admin/realms/master/clients?clientId=my-test-cli
H' Authorization: Bearer xyz
H' Content-Type: application/json

但是,当我想创建新的客户端角色或新客户端时,我总是会400出错。我将日志级别更改为DEBUGKeycloak 服务器中的日志级别,但除了看到显示令牌已成功创建的日志外,没有其他用处。

POST /auth/admin/realms/master/clients/7534ac42-fe8b-4cde-b6c6-c385f4958e3b/roles
400 {"error":"unknown_error"}

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

查看admin用户,它似乎具有所有角色,例如admin, default-roles-mastercreate-realm并且我在列表中看不到要分配的任何角色,因为它似乎拥有一切。对于admin-cli客户端也是一样。这两个(admin用户和admin-cli)的配置是你第一次启动服务器的默认配置。我是否需要任何额外的东西,比如创建一个新角色或其他东西才能让它发挥作用?

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

payload = {
    "name": "Some Name",
    "clientId": "some-name",
    "secret": "some-name-secret",
    "enabled": true,
    "publicClient": false,
    "authorizationServicesEnabled": true,
    "redirectUris" : ["/*"]
}

标签: keycloakkeycloak-rest-api

解决方案


我想回答我的问题,这样每个有类似情况的人都不会面临同样的问题。

原来我发送的有效载荷不正确,感谢@JanGaraj指出了这一点。但是我在这里要回答的是,如何找出请求体应该是什么样子的。

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

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

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

作为提示,您不需要在更新时传递所有内容,通常只有 ID 和您要更新的字段就足够了。


推荐阅读