首先,您需要一个具有足够权限的集成用户。我们的集成用户拥有开箱即用的足够权限,但您的故事可能会有所不同。快速检查是尝试使用菜单冒充其他用户。
- 以集成用户身份登录到 ServiceNow 实例。
- 转到 https://{instance}.service-now.com/nav_to.do
- 点击右上角的用户名。这是一个下拉菜单。
- 至少应该有三个菜单项:“Profile”、“Impersonate User”和“Logout”。如果您在此菜单中没有“模拟用户”,则您的集成用户会丢失一些权限。如果您错过此菜单项以配置适当的权限,请联系系统管理员。
然后,您需要找到要模拟的用户的 sys_id。例如:
https://{instance}.service-now.com/api/now/table/sys_user?sysparm_query=user_name={username}&sysparm_fields=sys_id
如果您有足够的权限,您可以使用您要模拟的用户的 sys id 调用以下端点:
- HTTP POST 到 https://{instance}.service-now.com/api/now/ui/impersonate/{user_sys_id},正文为“{}”,内容类型为“application/json”。作为集成用户,您需要为此查询提供 HTTP 基本身份验证。
成功的响应代码是 200。可以忽略响应正文。此响应的有趣结果是响应标头中模拟用户的一组 cookie。这些 cookie 可用于后续的 REST API 调用,直到它们过期。使用一些 HTTP REST 客户端相关的方法来捕获它们并将它们提供给下一次调用。
对于 Apache HTTP 客户端 (Java),我正在使用以下命令创建 http 客户端上下文:
HttpClientContext context = HttpClientContext.create();
context.setCookieStore(new BasicCookieStore());
将事物上下文传递给模拟请求和随后的 API 调用,直到我收到 401 回复,之后我重新获取 cookie。设置新的 cookie 存储很重要,否则会使用一些默认的 cookie 存储。
有两点需要注意:
- 这个 API 看起来像内部 API,所以它可以随时更改。如果发生这种情况,请查找“模拟用户”菜单项的作用,然后自己重复。
- ServiceNow 权限非常细粒度,因此目标用户可能缺乏执行操作的权限。在某些情况下,如果没有更新字段的权限,则对对象的 PATCH 操作会返回响应 200,但不会更新字段。当您使用模拟时,这会引入一种令人惊讶的失败模式。