KeyCloak用户验证和获取令牌

Roh*_*esh 7 java keycloak keycloak-services

首先,我对Keycloak非常陌生,请问如果我要问的问题可能是错的。

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

http:// localhost:8008 / auth

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

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

更新:


从使用UI 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"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

在本指南中,提到了可以使用“获取用户”来获取领域的用户返回用户列表,并根据查询参数进行过滤

GET /admin/realms/{realm}/users
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:8080/auth/admin/realms/DemoRelam/users
Run Code Online (Sandbox Code Playgroud)

谁能指导我?

mas*_*ick 21

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

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

curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" $KCHOST/auth/admin/realms/$REALM/users | jq
Run Code Online (Sandbox Code Playgroud)

代表客户(服务账户)

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

4)调用REST API端点:

curl -X GET -H "Authorization: Bearer $ACCESS_TOKEN" $KCHOST/auth/admin/realms/$REALM/users | jq
Run Code Online (Sandbox Code Playgroud)

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

哈 :)


Adn*_*han 2

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

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

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

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

  2. 生成一个新的令牌。

  3. 使用新令牌访问 API

你将拥有你的用户

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