在keycloak中调用create user api后如何获取userId?

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

我在我的node.js项目中实现了keycloak,并调用以下API在keycloak中添加用户:

{{keycloak_url}}/admin/realms/{{realm}}/users

这个 API 可以工作,我可以在 keycloak 中添加用户,但我需要 userId 来响应这个 API 我怎样才能得到这个,有任何替代方法吗

提前致谢

node.js keycloak rest keycloak-services keycloak-rest-api
2个回答
18
投票

我相信还有另一种方法可以做到这一点,这将为您节省额外的请求。如果您在创建用户时查看 响应标题,您应该会找到一个名为 “位置” 的字段。看起来像这样:

Location: http://keycloak_address/auth/admin/realms/realm/users/3a11cc77-9871-4f6e-805b-bf17ea79fa3a

在这种情况下,值“3a11cc77-9871-4f6e-805b-bf17ea79fa3a”将是新用户的 ID。


4
投票

更新:

Keycloak 17 Quarkus distribution
开始删除了/auth路径。因此,您可能需要从此答案中显示的端点调用中删除
/auth


您将 Keycloak Admin REST API 端点

GET /{realm}/users
与查询参数
username
结合使用。例如:

GET "{{keycloak_url}}/auth/admin/realms/{{realm}}/users/?username={{username}}"

注意: 在某些 Keycloak 版本中,它将返回用户名与 {{username*}} 匹配的所有用户。因此,您可以使用

exact=true
参数来仅获取那些匹配的
{{username*}}
。 对于那些使用 bash 脚本的人,我已经上传了 到我的存储库 一个关于当前如何进行过滤的示例。您只需从响应中提取字段
id


@Sillas Reis 首先指出的方法允许在一次调用中创建用户并获取其 ID,这样性能更高。然而,我不喜欢依赖未记录的行为。尽管如此,对于那些使用 bash 和curl 的人来说,解决方案可能如下所示:

使用具有适当权限的用户的

访问令牌调用Keycloak 管理 REST API。现在,我将使用来自 admin

 领域的 
master
 用户:

curl “https://${KEYCLOAK_HOST}/auth/realms/master/protocol/openid-connect/token” \ -d "client_id=admin-cli" \ -d "username=${ADMIN_NAME}” \ -d "password=${ADMIN_PASSWORD}" \ -d "grant_type=password"
您将收到带有管理员令牌的 JSON 响应。从该响应中提取属性 

access_token

 的值。让我们将其保存在变量
$ACCESS_TOKEN
中以供以后参考。

要在您的领域中创建用户

$REALM_NAME

并取回其
id
,请执行:

URL="https://${KEYCLOAK_HOST}/auth/admin/realms/${REALM_NAME}/users/" curl --include -X -s POST "${URL}" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d "$USER_JSON" | grep "Location: ${URL}" | grep -o '[^/]\+$'
标志 

--include

 将使 
curl
 包含标题,命令 
grep "Location: ${URL}"
 将从该位置提取位置,命令 
grep -o '[^/]\+$'
 提取用户 ID。

© www.soinside.com 2019 - 2024. All rights reserved.