如何在没有管理员帐户的情况下通过 REST 获取 Keycloak 用户

问题描述 投票:0回答:2

有没有办法使用管理员帐户通过 REST WITHOUT 获取 Keycloak 领域上的用户列表?也许可以从管理控制台分配某种角色?寻找任何想法。

现在,我正在使用管理员凭据来获取访问令牌,然后使用该令牌从

realm/users
端点拉取用户。

获取令牌(通过

request
从 Node.js 应用程序):

uri: `${keycloakUri}/realms/master/protocol/openid-connect/token`,
form: {
  grant_type: 'password',
  client_id: 'admin-cli',
  username: adminUsername,
  password: adminPassword,
}

使用代币:

uri: `${keycloakUri}/admin/realms/${keycloakRealm}/users`,
headers: {
  'authorization': `bearer ${passwordGrantToken}`,
}

我希望能够使用客户端应用程序中的通用用户信息(用户名、电子邮件、全名)。

keycloak keycloak-services
2个回答
48
投票

您需要从

view-users
客户端为所需用户分配
realm-management
角色。这将是用户的配置:

然后您可以从

${keycloakUri}/admin/realms/${keycloakRealm}/users
端点获取所有用户。这是从 enpoint 检索到的信息,通过 Postman 访问:

此外,与所提出的问题无关,我强烈建议您不要使用

grant_type=password
,除非您绝对需要。来自 keycloak 博客

RESULT=`curl --data "grant_type=password&client_id=curl&username=user&password=password" http://localhost:8180/auth/realms/master/protocol/openid-connect/token`

这有点神秘,幸运的是这不是您真正应该获取代币的方式。 Web 应用程序应通过重定向到 Keycloak 登录页面来获取令牌。我们这样做只是为了测试该服务,因为我们还没有可以调用该服务的应用程序。基本上,我们在这里所做的是调用 Keycloaks OpenID Connect 令牌端点,并将授权类型设置为密码,这是资源所有者凭证流程,允许将用户名和密码交换为令牌。

另请参阅 Oauth2 规范


0
投票

我遇到了同样的问题,我通过以下步骤解决了它:

第1步:创建一个领域,转到设置选项卡并选择以下内容(与下图匹配)并保存:

客户端协议:openid-connect

访问类型:机密

第 2 步: 根据屏幕截图提供所有范围/客户端范围/:

第 3 步: 转到凭据并选择 clientId 和 Secret

第4步:点击下面的curl获取access_token:

curl --location 'http://localhost:18080/auth/realms/test-realm/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCIgO...' \
--header 'Cookie: OPERATE-SESSION=DD9F694EE1D511CAE6E126E5503A8995; TASKLIST-SESSION=A0841A5A17C43122443A3DAC4A88060A' \
--data-urlencode 'client_id=test-realm' \
--data-urlencode 'client_secret=8lu1gy4v0Ajt5WjyjgiTXKzuLijE8lpe' \
--data-urlencode 'grant_type=client_credentials'

第5步:您将收到响应中的access_token:

{
    "access_token": "eyJhbGciOiJSUzI1...I9X3Exs5a_jR_gjmHO6yLZBuoiS3G2BU8_i9Bb2DYDCWWz5awbsg",
    "expires_in": 36000,
    "refresh_expires_in": 0,
    "token_type": "Bearer",
    "not-before-policy": 0,
    "scope": "profile email"
}

第6步:现在使用以下curl获取具有上述访问令牌的用户数据:

curl --location 'http://localhost:18080/auth/admin/realms/test-realm' \
--header 'Authorization: bearer eyJhbGciOiJSUzI1NiIsInR5cCI...Sa3upI9X3Exs5a_jR_gjmHO6yLZBuoiS3G2BU8_i9Bb2DYDCWWz5awbsg' \
--header 'Cookie: OPERATE-SESSION=DD9F694EE1D511CAE6E126E5503A8995; TASKLIST-SESSION=A0841A5A17C43122443A3DAC4A88060A'

回应:

{
    "id": "test-realm",
    "realm": "test-realm",
    "displayName": "test-realm",
    "displayNameHtml": "test-realm",
    "failureFactor": 30,
    "browserFlow": "browser",
    "registrationFlow": "registration",
    .
    .
}
© www.soinside.com 2019 - 2024. All rights reserved.