KeyCloak用户验证和获取令牌

时间:2018-03-30 09:58:40

标签: java keycloak keycloak-services

首先,我对keycloak很新,请原谅我,如果我问的不对劲。

我已经安装了keycloak服务器,我可以使用以下方式访问web ui:

http://localhost:8008/auth

我的要求是通过将关键用户传递给keycloak api并从响应中获取令牌来验证它,然后将此令牌传递给我的其他web api调用。

但是,我无法找到一个如何做到这一点的简单指南? 任何人都可以帮助我。

更新:

使用KEYCLOCK中的UI:

到目前为止

  • 我可以创建一个关系: 例如:DemoRelam

  • 根据Relam,我创建了客户端: 例如:DemoClient

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

使用邮递员:

我也可以使用

成功获取令牌
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

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

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

任何人都可以指导我。

2 个答案:

答案 0 :(得分:0)

keycloak中的用户是特定于领域的,并非每个用户都可以访问它们。在管理控制台中为用户分配特定角色后,您将能够通过admin API获得所有用户。只需

  1. 在管理控制台中,转到
  

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

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

  2. 生成新令牌。

  3. 使用新令牌访问API

您将拥有您的用户

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

答案 1 :(得分:0)

您有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 users endpoint

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

代表客户(服务帐户)

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

2)转到Service account roles tab并为此客户选择适当的角色,例如realm-admin组中的realm-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
  

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

HTH:)

相关问题