UiPath Orchestrator

UiPath Orchestrator ガイド

Webhook について

Webhook を使用すると、UiPath オートメーションをアプリケーション エコシステム全体とより適切に統合できます。これにより、Orchestrator イベントをサブスクライブして、任意の外部 DCM、BPM、CRM ソリューションに送信できます。また、処理可能な新しいキュー アイテムの発生、トリガーの失敗、プロセスの更新などがあった場合にユーザーに通知することもできます。

Webhook では、さまざまなタイプの Orchestrator イベントを外部システムがサブスクライブしてリッスンすることができます。サブスクライブするイベントは [Webhooks] ページで設定が簡単にでき、作成済みのものも確認できます。また、Webhook の無効化、検索、編集、削除も行えます。

このページは [ユーザー (User) メニューから開きます。

イベントは、ジョブ、ロボット、キュー、キュー アイテム、プロセス、トリガーで使用できます。全イベントの種類と例については、このページで確認してください。

各イベントは、情報を含む指定した URL にペイロードを送信します。プロパティには、すべてに共通なものとイベントタイプに固有のものがあります。

共通のペイロードプロパティ

Property Name

Property Type

Description and Example

Type

string

The event type that triggered the notification.

This property is displayed for all types of events.

Example:

"Type": "job.created"

"Type":"process.updated"

EventId

string

An identifier uniquely generated for each event when it occurred.

This property is displayed for all types of events.

Example:

"EventId":"3e5af0113e674ae597c579cb35ed8630"

Timestamp

RFC 8601 date

The date and time at which the event was generated.

This property is displayed for all types of events.

Example:

"Timestamp":"2018-11-02T11:47:48.5790797Z"

TenantId

integer

The id of the tenant on which the event was generated. The default tenant is 1.

This property is displayed for all types of events.

Example:

"TenantId":3

UserId

integer

The user id whose action triggered the event.
This parameter is not displayed if the event is triggered by either a Robot or a trigger.

This property is displayed for all types of events.

Example:

"UserId": 4947

FolderId

integer

The id of the folder in which the event was generated.
This parameter is not displayed for events triggered by modern robots.

Example:

"FolderId": 26

結果

[Webhooks] ページでさまざまな操作を行うには、Webhook 上で該当する権限を持っていなければなりません。

  • 表示 (View) - Webhook とその詳細を確認する、そうした情報をAPI を使用してあるいは Ping 要求を送信することで取得する、Webhook がサブスクライブできる全イベントの一覧を取得するなどが可能です。
  • 作成 (Create) - この権限があると、新しい Webhook を追加できます。これには、表示 (View) 権限も必要になります。
  • 編集 (Edit) - UI または API を使用して Webhook を編集する権限が付与されます。これには、表示 (View) 権限も必要になります。
  • 削除 (Delete) - Webhook を削除できる権限です。これには、表示 (View) 権限も必要になります。

認証 (Authentication)

すべての Webhook HTTP 要求は、Webhook の作成時に追加した秘密を使って認証します。これは、HMAC-SHA256 鍵付きハッシュを使用して要求本文と結合されます。その結果、秘密情報を一切含まないセキュアな署名となります。この署名は、要求ごとに一意であり、X-UiPath-Signature HTTP ヘッダーを通じて送信されます。

Orchestrator の要求を受信するクライアントアプリケーションは、要求の信頼性をチェックする必要があります。要求の署名は、次のパターンに従って行われます。

  • クライアントアプリケーションは、Orchestrator からの要求を受信します。
  • クライアントアプリケーションは、要求に基づいて署名を計算します。
  • クライアントアプリケーションは、自身が計算した署名と要求の署名を照合します。
    • 署名が一致しない場合、クライアントアプリケーションは要求を処理しません
    • 署名が一致した場合、クライアントアプリケーションは要求を処理します。

署名の計算は、次のように行われます。

  1. X-UiPath-Signature HTTP ヘッダーを取得します。
  2. 署名のローバイトを取得するには、Base64 からヘッダーの値をデコードします。
  3. 生の (ロー) 要求本文を取得します。

📘

重要!

Orchestrator の要求は常に UTF-8 でエンコードされています。

  1. SHA256 と (UTF-8 でエンコードされた) 署名鍵を使用してハッシュを計算します。
  2. 計算した署名と X-UiPath-Signature HTTP ヘッダーからの値を照合します。
    • 署名が一致しない場合、要求を処理してはいけません
    • 署名が一致した場合、クライアントアプリケーションは要求を処理します。

署名検証の例

using System;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
 
 
public async Task<bool> IsValidRequestAsync(HttpRequestMessage request, string secret)
{
    if (!request.Headers.TryGetValues("X-UiPath-Signature", out var headerValues))
        return false;
 
    var orchestratorSignature = Convert.FromBase64String(headerValues.First());
    using (var sha = new HMACSHA256(key: Encoding.UTF8.GetBytes(secret)))
    {
        var computedSignature = sha.ComputeHash(await request.Content.ReadAsByteArrayAsync());
        return ByteArrayEquals(orchestratorSignature, computedSignature);
    }
}
const { createServer } = require('http');
const { createHmac } = require('crypto');
 
const PORT = 9090
const WEBHOOK_SECRET = '<same secret as configured in Orchestrator>'
 
const isValidRequest = (body /* Buffer */, secret /* string */, expectedSignature /* string */) =>
    expectedSignature == null || createHmac('sha256', secret)
        .update(body)
.digest('base64')=== expectedSignature
 
const server = createServer((req, resp) => {
 
    let body = new Buffer([])
 
    req.on('data', chunk => body = Buffer.concat([body,chunk]))
 
    req.on('end', () => {
 
        if (!isValidRequest(body, WEBHOOK_SECRET, req.headers['x-uipath-signature'])) {
            console.error('Invalidsignature')
            resp.statusCode = 401 // Unauthorized
        } else {
 
            let payload = JSON.parse(body.toString('utf8'))
 
// Process request
            console.log(payload)
 
resp.statusCode = 202 // Accepted
        }
 
        resp.end()
})
 
})
 
server.listen(PORT)

2 か月前に更新



Webhook について


改善の提案は、API 参照ページでは制限されています

改善を提案できるのは Markdown の本文コンテンツのみであり、API 仕様に行うことはできません。