18

首先,我对 Keycloak 很陌生,如果我问的问题可能有问题,请原谅。

我已经安装了 Keycloak 服务器,我可以使用以下方法访问 Web UI:

http://localhost:8008/auth

我的要求是通过将领域用户传递给 k Keycloak API 来验证领域用户,并从那里获取令牌作为响应,然后将此令牌传递给我的其他 Web API 调用。

但是我找不到有关如何执行此操作的简单指南...

更新:


使用用户界面KEYCLOAK

到目前为止:

  • 我能够创建一个realm:例如:DemoRealm

  • Realm我创建了客户端下:例如:DemoClient

  • 在客户端下我创建了用户:例如:DemoUser

使用POSTMAN

我也能够使用成功获得令牌

http://localhost:8080/auth/realms/DemoRelam/protocol/openid-connect/token

POST:
{
"grant_type": "client_credentials",
"username": "",
"password": "",
"client_secret":"",
"client_id":"DemoClient"
}

作为回应,我得到了令牌。

{
    "access_token": "eyJhbGciOiJSUzI1NiIsINVSHGhepnDu13SwRBL-v-y-04_6e6IJbMzreZwPI-epwdVPQe-ENhpvms2WdGM_DmgMLZ8YQFS4LDl9R7ZHT8AgXe-WCFV6OFkA7zvdeFwQ4kVVZE0HlNgHgoi4DrgMfwwz_ku1yJNJP3ztTY1nEqmA",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJRRnB5YlloMGVEektIdlhOb3JvaFUxdlRvWVdjdP3vbfvk7O0zvppK9N4-oaUqZSr0smHv5LkuLDQYdPuxA",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "bb1c586a-e880-4b96-ac16-30e42c0f46dc"
}

此外,我深入研究了更多细节并找到了这个 API 指南:

http://www.keycloak.org/docs-api/3.0/rest-api/index.html#_users_resource

在本指南中提到,我可以使用 Get users 返回用户列表,根据查询参数过滤该领域的用户

GET /admin/realms/{realm}/users

但是当我POSTMAN用来获取用户时,我得到了403错误代码。我传递的令牌与我在前面步骤中获得的身份验证相同。

http://localhost:8080/auth/admin/realms/DemoRelam/users

谁能指导我?

4

2 回答 2

26

您有 2 个选择:您可以代表某个用户(正如Adnan Khan指出的那样),或者为此创建一个专用客户端。

代表用户

1)创建一个机密客户(我想你已经有了一个)

2)创建一个用户并为其分配适当的角色:例如view-users来自realm-management

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

KCHOST=https://yourkeycloak.com
REALM=realm
CLIENT_ID=confidential-client
CLIENT_SECRET=xxxxxxx-yyyyyy-zzzzzzzz
UNAME=user
PASSWORD=passwd

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

4) 最后调用 Admin REST API用户端点

curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" $KCHOST/auth/admin/realms/$REALM/users | jq

代表客户(服务帐户)

1) 创建一个机密客户端并确保将启用服务帐户设置切换为On

2)转到Service account roles tab并为此客户选择适当的角色,例如realm-adminrealm-management组中

3) 获取访问令牌

KCHOST=https://yourkeycloak.com
REALM=realm
CLIENT_ID=protector-of-the-realm
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) 调用 REST API 端点:

curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" $KCHOST/auth/admin/realms/$REALM/users | jq

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

HTH :)

于 2019-06-30T12:40:33.230 回答
2

keycloak 中的用户是特定于领域的,并非每个用户都可以访问它们。在管理仪表板中为用户分配特定角色后,您将能够通过管理 API 获取所有用户。简单地做

  1. 在管理仪表板中,转到

用户 > myuser > 角色映射 > 客户端角色 > 领域管理

  1. 为用户分配两个角色中的任何一个manage-usersview-users.

  2. 生成新令牌。

  3. 使用新令牌命中 API

你将拥有你的用户

Ps 我认为您应该将问题标题更新为更相关的内容。

于 2019-06-28T11:32:19.523 回答