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

Dha*_*val 6 rest node.js keycloak keycloak-services keycloak-rest-api

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

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

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

提前致谢

小智 18

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

Location: http://keycloak_address/auth/admin/realms/realm/users/3a11cc77-9871-4f6e-805b-bf17ea79fa3a
Run Code Online (Sandbox Code Playgroud)

在本例中,值“3a11cc77-9871-4f6e-805b-bf17ea79fa3a”将是新用户的 ID。


dre*_*ash 4

更新:从Keycloak 17 Quarkus 发行版/auth开始,该路径已被删除。因此,您可能需要从该答案中显示的端点调用中删除 。/auth

\n
\n

您可以将Keycloak Admin REST API端点GET /{realm}/users与查询参数结合使用username。例如:

\n
GET "{{keycloak_url}}/auth/admin/realms/{{realm}}/users/?username={{username}}"\n
Run Code Online (Sandbox Code Playgroud)\n

注意:在某些 Keycloak 版本中,它将返回用户名与 {{username*}} 匹配的所有用户。因此,可能需要对列表进行额外的过滤。对于那些使用 bash 脚本的人,我已经将一个关于当前如何进行过滤的示例上传到我的存储库。您只需从响应中提取字段即可id

\n
\n

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

\n

使用具有适当权限的用户的访问令牌调用Keycloak Admin REST API 。现在,我将使用领域中的用户:adminmaster

\n
GET "{{keycloak_url}}/auth/admin/realms/{{realm}}/users/?username={{username}}"\n
Run Code Online (Sandbox Code Playgroud)\n

您将收到带有管理员令牌的 JSON 响应。access_token从该响应中提取属性值。让我们将其保存在变量中$ACCESS_TOKEN以供以后参考。

\n

要在您的领域中创建用户$REALM_NAME并恢复其id执行:

\n
curl \xe2\x80\x9chttps://${KEYCLOAK_HOST}/auth/realms/master/protocol/openid-connect/token\xe2\x80\x9d \\\n    -d "client_id=admin-cli" \\\n    -d "username=${ADMIN_NAME}\xe2\x80\x9d \\\n    -d "password=${ADMIN_PASSWORD}" \\\n    -d "grant_type=password"\n
Run Code Online (Sandbox Code Playgroud)\n

该标志--includecurl包含标头,并且该命令grep "Location: ${URL}"将提取位置和命令 grep -o \'[^/]\\+$\'用户 ID。

\n