我正在使用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小时我一直在此问题上,我认为我需要来到这里大喊帮助。预先感谢
答案 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:)