0

我正在开发一个使用 Service Now API (Rest) 的项目。为此,我们的客户已将我们注册为用户,以便登录并进行我们需要的所有服务调用。这个项目有一个界面,用户一旦在 Service Now 上拥有一个帐户就可以登录,顺便说一下,他们输入的登录用户名与 service now 无关,但后来他们将他们的 service now 用户关联到它。他们可以通过这个界面进行一些操作,所有这些操作都是使用集成用户/pass 而不是他们的服务现在用户自己完成的,即使他们不需要与我们分享他们的密码。但是现在需要跟踪正确的用户才能注册服务,而我在评论事件时遇到了麻烦。要评论的端点如下:

http://hostname/api/now/table/incident/ {sys_id}

其中请求正文是一个 json 对象,就像这样简单:

{
"comments": "My comment is foo bar"
}

但是,当此评论在 Service Now 上注册时,它在集成用户而不是评论的用户下。考虑到我已经在 Service Now 上准备好了用户 ID,我有什么办法可以保留特定用户,以便按照应有的方式通知请求。我尝试阅读 Service Now 文档,但不知道如何解决它,虽然我发现了一些关于模拟的东西

4

2 回答 2

0

发生这种情况是因为您通过“集成用户”而不是您自己的帐户进行代理。只要是这种情况,您的评论就会归于集成用户。

我可以想到两种方法来解决这个问题。

  1. 要求客户以用户身份直接将您登录到他们的系统。

  2. 实现一个特殊的 API(Scripted REST API,在日内瓦或更高版本可用),允许您识别事件并输入评论,然后脚本代表您伪造评论,正确归属作者。

由于可能的额外许可成本,第一个解决方案可能很昂贵。

第二种解决方案需要愿意的客户投入 2-3 小时的开发时间,具体取决于程序员。

于 2016-12-22T18:27:31.917 回答
0

首先,您需要一个具有足够权限的集成用户。我们的集成用户拥有开箱即用的足够权限,但您的故事可能会有所不同。快速检查是尝试使用菜单冒充其他用户。

  1. 以集成用户身份登录到 ServiceNow 实例。
  2. 转到 https://{instance}.service-now.com/nav_to.do
  3. 点击右上角的用户名。这是一个下拉菜单。
  4. 至少应该有三个菜单项:“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,但不会更新字段。当您使用模拟时,这会引入一种令人惊讶的失败模式。
于 2020-09-08T19:17:04.267 回答