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

bla*_*sei 4 realm keycloak

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

我已经开始使用 ansible 来解决这个问题,但由于没有取得任何进展,我转向了简单的 REST。我已使用主用户名和密码来获取令牌调用/auth/realms/master/protocol/openid-connect/token。看起来像下面的 POST 请求/响应,我要么调用了错误的 url,要么使用错误的 Content-Type 进行调用(尝试仅使用表单{"realm": "somerealm"}url 编码类型发送,而 keycloak 仅返回 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
Run Code Online (Sandbox Code Playgroud)

谁能暗示一下上面的问题吗?过去 24 小时我一直在处理这个问题,我想我需要来这里大声呼救。提前致谢

mas*_*ick 5

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'`
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

PS 顺便说一句,为了调试,我刚刚编写了一个名为brauzie的 CLI 工具,它可以帮助您获取和分析 JWT 令牌(范围、角色等)。它可用于公共和机密客户。如果您愿意,也可以使用 Postman 和https://jwt.io 。

哈:)

  • 我没有找到“领域角色”部分下列出的任何内容。我需要启用一些额外的功能吗? (2认同)
  • @Sankar 据我所知,这只有在“master”领域才有可能。我尝试在“my-realm”中创建角色“create-realm”,但没有成功。我还尝试将角色“create-realm”添加到 masters 客户端内的客户端“my-realm-realm”,这也不允许我从 REST API 创建领域。所做的更改是在“master”客户端中创建一个客户端“my-client”,并在那里分配角色“create_realm”。从`{{keycloak}}/auth/realms/{{realm}}/protocol/openid-connect/token`获取令牌,其中realm是`master`和`client_id: my-client`。 (2认同)