密钥保护用户验证和获取令牌

2022-09-02 09:36:47

首先,我对Keycloak很陌生,如果我问的东西可能是错的,请原谅我。

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

http://localhost:8008/auth

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

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

更新:


从以下位置使用 UI:KEYCLOAK

到目前为止:

  • 我能够创建一个:例如:realmDemoRealm

  • 在“我已创建客户端”下:例如:RealmDemoClient

  • 在客户端下,我创建了用户:例如: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 /admin/realms/{realm}/users

但是当我使用获取用户时,我得到的是403错误代码。我正在传递与在上一步中获得的身份验证相同的令牌。POSTMAN

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

任何人都可以指导我吗?


答案 1

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

代表用户

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

2)创建一个用户并为其分配适当的角色:例如 从组view-usersrealm-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 tabrealm-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

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

HTH :)


答案 2

密钥保护套中的用户是特定于领域的,并非每个用户都有权访问它们。在管理仪表板中为用户分配特定角色后,您将能够通过管理 API 获取所有用户。只需做

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

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

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

  2. 生成新令牌。

  3. 使用新令牌命中 API

您将拥有您的用户

P.S 我认为你应该更新你的问题标题到更相关的内容。


推荐