Mit Webhooks können Sie Ihre UiPath-Automatisierung besser in Ihre gesamtes Anwendungsumgebung integrieren. Sie können Orchestrator-Ereignisse abonnieren und sie an beliebige externe DCM-, BPM- oder CRM-Lösungen senden und verschiedene Benutzer informieren, z. B. dass ein neues Warteschlangenelement verarbeitet werden kann, ein Trigger fehlgeschlagen ist oder ein Prozess aktualisiert wurde.
Webhooks allow external systems to subscribe and listen to different types of Orchestrator events. The Webhooks page enables you to easily set them up and view the ones that have been previously created. You can also disable webhooks, search for a specific one, edit or delete them.
Events are available for jobs, robots, queues, queue items, processes, and triggers. For the complete list of event types and a few examples, please check this page.
Jedes Ereignis sendet Nutzdaten mit Informationen an eine angegebene URL. Einige Eigenschaften gelten für alle gemeinsam, während andere jeweils für einen bestimmten Ereignistyp bestimmt sind.
Häufige Eigenschaften von Nutzdaten
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 |
Berechtigungen
Um die verschiedenen Operationen auf der Seite Webhooks durchführen zu können, müssen Ihnen die entsprechenden Berechtigungen erteilt worden sein:
- View - Enables you to view webhooks and their details, as well as retrieve them using the API, send a ping request, or get the list of all the events a webhook can subscribe to.
- Erstellen (Create) - Diese Berechtigung ermöglicht Ihnen, neue Webhooks hinzuzufügen. Bitte beachten Sie, dass Sie auch Anzeige-Berechtigungen brauchen.
- Edit - Grants you the right to edit webhooks from the UI or by using the API. Please note that you also require View permissions.
- Löschen (Delete) - eine Berechtigung, mit der Sie Webhooks löschen können. Bitte beachten Sie, dass Sie auch Anzeige-Berechtigungen brauchen.
Authentication
Alle Webhook HTTP-Anforderungen verwenden den Geheimschlüssel, den Sie hinzufügen, wenn Sie einen Webhook zum Authentifizieren erstellen. Er wird mit einem HMAC-SHA256 Keyed-Hash mit dem Anforderungstext kombiniert. Daraus entsteht eine sichere Signatur, die keine geheimen Informationen enthält, einzigartig für jede Anforderung ist und durch den X-UiPath-Signature
-HTTP-Header gesendet wird.
Client-Apps, die Orchestrator-Anforderungen erhalten, müssen die Echtheit der Anforderungen überprüfen. Die Anforderungssignatur hat folgendes Muster:
- Die Client-App erhält eine Webhook-Anforderung von Orchestrator.
- Die Client-App berechnet basierend auf der Anforderung eine Signatur.
- Die Client-App versucht, festzustellen, ob die berechnete Signatur mit der Anforderungssignatur übereinstimmt.
- Stimmen die Signaturen nicht überein, darf die Client-App die Anforderung nicht bearbeiten.
- Stimmen die Signaturen überein, muss die Client-App die Anforderung bearbeiten.
Berechnung der Signatur:
- Rufen Sie den HTTP-Header
X-UiPath-Signature
ab. - Um die rohen Signaturbytes zu erhalten, decodieren Sie den Wert des Headers mit Base64.
- Rufen Sie den rohen Hauptteil der Anforderung ab.
Wichtig!
Orchestrator-Anforderungen sind immer mit UTF-8 codiert.
- Berechnen Sie den Hash mit SHA256 und dem Signaturschlüssel (mit UTF-8 verschlüsselt).
- Vergleichen Sie die berechnete Signatur mit dem Wert des HTTP-Headers
X-UiPath-Signature
:- Stimmen die Signaturen nicht überein, darf die Anforderung nicht bearbeitet werden.
- Stimmen die Signaturen überein, muss die Client-App die Anforderung bearbeiten.
Beispiele für Signaturvalidierung
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('Invalid signature')
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)
Aktualisiert vor 8 Monaten