我在我的node.js项目中实现了keycloak,并调用以下API在keycloak中添加用户:
{{keycloak_url}}/admin/realms/{{realm}}/users
这个 API 可以工作,我可以在 keycloak 中添加用户,但我需要 userId 来响应这个 API 我怎样才能得到这个,有任何替代方法吗
提前致谢
我相信还有另一种方法可以做到这一点,这将为您节省额外的请求。如果您在创建用户时查看 响应标题,您应该会找到一个名为 “位置” 的字段。看起来像这样:
Location: http://keycloak_address/auth/admin/realms/realm/users/3a11cc77-9871-4f6e-805b-bf17ea79fa3a
在这种情况下,值“3a11cc77-9871-4f6e-805b-bf17ea79fa3a”将是新用户的 ID。
更新:从
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。