java - KeyCloak 用户验证和获取 token

标签 java keycloak keycloak-services

首先,我是 Keycloak 的新手,如果我问的问题可能有误,请原谅。

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

http://localhost:8008/auth

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

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

更新:


使用来自 KEYCLOAK 的 UI:

到目前为止:

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

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

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

使用 postman :

我也能够使用成功获取 token

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

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

作为响应,我得到了 token 。

{
    "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

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

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

有人可以指导我吗?

最佳答案

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

代表用户

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

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

3) 获取 token (我正在使用 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 users endpoint :

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

代表客户(服务帐户)

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

2) 转到Service account roles 选项卡 并为此客户端选择适当的角色,例如realm-admin 来自 realm-management

3) 获取访问 token

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

P.S. For debugging I have just written a CLI tool called brauzie that would help you fetch and analyse your JWT tokens (scopes, roles, etc.). It could be used for both public and confidential clients. You could as well use Postman and https://jwt.io

HTH:)

关于java - KeyCloak 用户验证和获取 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572291/

相关文章:

java - 文件读取不显示任何文件实际数据

java - 二叉搜索树的字符串表示

docker - Keycloak SSL 更新 certbot 证书

oauth-2.0 - 如何在 Keycloak 中指定刷新 token 的生命周期

keycloak - Keycloak 需要数据库吗

cookies - 使用访问或 ID token / token 交换建立 SSO/设置 cookie

java - Regex - 将模式从 php 转换为 Java

java - 如何使用 FileInputStream 加载配置 xml 文件,但出现 FileNotFoundException

Kubernetes Keycloak Gatekeeper 坏网关

oauth - 我可以自己设置 KEYCLOAK_IDENTITY cookie吗