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

时间:2019-06-25 12:13:06

标签: realm keycloak

我正在使用keycloak 4.8.3,并且尝试使用admin api创建新的领域和用户。根据{{​​3}},它看起来像是导入调用。假设我在本地主机上运行keycloak,则api网址应类似于http://localhost:8080/auth/。我对该文档有些困惑,因为该文档在POST /以外的确切路径上没有明确显示,因此不确定是否为POST /admin/realms

我已经开始使用ansible进行此工作,并且由于没有取得任何进展,因此我转向了普通的REST。我已经使用主用户名和密码来获取调用/auth/realms/master/protocol/openid-connect/token的令牌。看起来与下面的POST请求/响应类似,我要么调用了错误的url,要么使用错误的Content-Type进行了调用(尝试仅发送具有形式url编码类型和keycloak的{"realm": "somerealm"},但仅返回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小时我一直在此问题上,我认为我需要来到这里大喊帮助。预先感谢

2 个答案:

答案 0 :(得分:2)

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

我想本主题中介绍的解决方案在最近的版本中已被删除。从最新版本(10.0.2)的Keycloak开始,使用下面链接的线程中列出的解决方案,对领域创建API的POST请求失败,并显示500错误:

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

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

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

这在Keycloak API方面是一个非常明显的缺点。如果没有能够通过API创建能够执行此操作的客户端的功能,就不应剥夺将新领域发布到API的能力。

答案 1 :(得分:1)

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

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。顺便说一句,为了调试,我刚刚编写了一个名为brauzie的CLI工具,   可以帮助您获取和分析JWT令牌(作用域,角色等)。它可能   适用于公共和机密客户。你也可以   如果需要,请使用Postman和https://jwt.io

HTH:)