【问题标题】:Service now api how to comment as specific userService now api 如何以特定用户的身份发表评论
【发布时间】:2016-12-21 17:01:56
【问题描述】:

我正在开发一个使用 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 文档,但不知道如何解决它,但我发现了一些关于模拟的内容

【问题讨论】:

    标签: integration servicenow itsm


    【解决方案1】:

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

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

    1. 让客户以用户身份直接登录到他们的系统。

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

    由于可能需要额外的许可费用,第一个解决方案可能很昂贵。

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

    【讨论】:

    • 感谢您的回答。一旦用户无法输入密码,第一个选项是不可能的。第二个选项看起来不错,ServiceNow API 的自定义,对吧?这可能行得通,但想法是:我们的应用程序必须能够连接到来自不同客户端的许多服务实例,互操作性是我们应该维护的东西,有时我们将无法自定义它
    • 如果您无法自定义客户的 ServiceNow 实例,那么您将无法在制作 cmets 时更改任何日志记录中的 sys_created_by 字段。 sys_created_by 字段记录了登录人的身份,假设与作者相同。您试图告诉系统登录的人与作者不同。您可以操作 sys_created_by 字段,但您需要以某种方式获得对 ServiceNow 中记录的写入权限。这将需要通过 Scripted REST API 或 Business Rule 或类似的东西来自定义脚本。
    • 顺便说一句:你提到了一些关于模仿的事情。事实上,您可以冒充某人并发表评论,假设您所冒充的人有足够的权限访问事件记录并离开 cmets。问题是它要求您对 ServiceNow 实例具有管理员权限;我怀疑你的客户不会同意的东西。
    【解决方案2】:

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

    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,但不会更新字段。当您使用模拟时,这会导致一种令人惊讶的失败模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2018-01-23
      相关资源
      最近更新 更多