无法通过其余管理员创建 Keycloak 领域 API:不支持的媒体类型

Unable to create Keycloak realm via the rest admin API: Unsupported Media Type

我正在使用 keycloak 4.8.3,我正在尝试使用管理员 api 创建一个新领域和用户。根据 the documentation ,它看起来像是导入调用。假设我是本地主机上的 运行 keycloak,api url 应该看起来像 http://localhost:8080/auth/。我也对文档感到有点困惑,除了 POST / 之外,它在确切路径上没有明确说明,所以不确定它是否是 POST /admin/realms.

我已经开始使用 ansible 来解决这个问题,但由于没有取得任何进展,我转向了普通的 REST。我已经使用主用户名和密码获得了调用 /auth/realms/master/protocol/openid-connect/token 的令牌。看起来像下面的 POST request/response,我要么调用了错误的 url,要么使用错误的 Content-Type 进行调用(尝试仅使用 {"realm": "somerealm"} 发送表单url 仅编码类型和 keycloak returns OK 等等,但没有创建任何东西)。

> POST /auth/ HTTP/1.1
> Host: localhost:8080
> User-Agent: insomnia/6.5.4
> Content-Type: application/json
> Authorization: bearer eyJhbGcisomelongbearertoken"
> Accept: */*
> Content-Length: 373

| {
|   "realm": "somerealm",
|   "displayName": "somerealm",
|   "enabled": true,
|   "users": [
|       {
|           "email": "apigateway@example.com",
|           "enabled": true,
|           "firstName": "APIGateway",
|           "lastName": "SomeProject",
|           "usename": "api-manager",
|           credentials: [
|               {
|                   "temporary": false,
|                   "type": "password",
|                   "value": "somedecentpassword"
|               }
|           ]
|       }
|   ]
| }

* upload completely sent off: 373 out of 373 bytes

< HTTP/1.1 415 Unsupported Media Type
< Date: Tue, 25 Jun 2019 11:13:44 GMT
< Content-Length: 0
< Connection: keep-alive

任何人都可以提示上面的问题,过去 24 小时我都在处理这个问题,我想我需要来这里大声呼救。提前致谢

1) 在 Keycloak Web 控制台中单击“客户端”选项卡并创建一个新的机密客户端(称之为 realm-creator),确保将 Service Accounts Enabled 设置切换为 ON

2) 转到 Service account roles 选项卡并将 create-realm(来自 Realm roles 组)角色分配给您的客户。

3) 获取访问令牌(我正在使用 curl 和 jq

KCHOST=https://yourkeycloak.com
REALM=master
CLIENT_ID=realm-creator
CLIENT_SECRET=xxxxxxx-yyyyyyyy-zzzzzzzzz

ACCESS_TOKEN=`curl \
  -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" \
  -d "grant_type=client_credentials" \
  "$KCHOST/auth/realms/$REALM/protocol/openid-connect/token"  | jq -r '.access_token'`

4) 将你的领域设置为realm.json

5) 最后调用 REST API 端点:

curl -v -X POST \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @realm.json \
  $KCHOST/auth/admin/realms

P.S. Btw, for debugging I have just written a CLI tool called brauzie that would help you fetch and analyse your JWT tokens (scopes, roles, etc.). It could be used for both public and confidential clients. You could as well use Postman and https://jwt.io if you wish to.

HTH:)

这是我能找到的关于这个主题的最完整的讨论,简短的回答是,截至 2020 年 7 月,还没有办法完全自动化 Keycloak 部署,包括创建一个新领域,因为没有API 个用于创建具有服务帐户角色的客户端的端点。

我认为本主题中提供的解决方案已在最新版本中删除。从 Keycloak 的最新 (10.0.2) 版本开始,POST 请求领域创建 API 使用下面链接的线程中列出的解决方案失败并出现 500 错误:

https://devops.stackexchange.com/questions/11078/creating-keycloak-realm-via-ansible

在这个最新版本的 Keycloak 中公开客户端服务角色“create-realm”的唯一方法是创建一个机密客户端,然后将“服务帐户角色”公开为布尔选项和属性列表如 maslick 的回复所述,机密客户端(如果已启用)。届时,用户可以将“create-realm”添加为客户端允许的角色。

但是,在客户端创建 API 下没有明显的“服务帐户角色”端点或功能,因此到目前为止,用户必须通过 Web 控制台创建这样的客户端。 API 可以为服务帐户角色启用布尔选项,但不能通过 API 将这些角色添加到客户端。如果您必须进入 Web 控制台来创建客户端,您也可以指向并单击一个新领域,而无需尝试跳过这些步骤。

这是 Keycloak API 的一个非常明显的缺点。如果没有创建能够这样做的客户端的能力,POST 新领域到 API 的能力不应该被剥夺,也可以通过 API.