- Démarrage
- Meilleures pratiques
- Locataire
- Contexte des dossiers
- Automatisations
- Processus (Processes)
- Tâches (Jobs)
- Déclencheurs (Triggers)
- Journaux (Logs)
- Surveillance
- Files d'attente (Queues)
- Actifs
- Compartiments de stockage
- Test Suite - Orchestrator
- Autres configurations
- Intégrations
- Robots classiques
- Administration de l'hôte
- À propos du niveau de l’hôte
- Gestion des administrateurs système
- Gestion des locataires
- Configuration des notifications par e-mail du système
- Journaux d'audit pour le portail hôte
- Mode de Maintenance
- Administration de l'organisation
- Résolution des problèmes
Guide de l'utilisateur d'Orchestrator
Webhooks
Webhooks vous permet de mieux intégrer votre automatisation UiPath à votre ensemble d'applications. Vous pouvez vous inscrire aux événements Orchestrator et les envoyer à n'importe quelle solution externe de DCM, BPM ou CRM et informer différents utilisateurs, par exemple, qu'un nouvel élément de la file d'attente peut être traité, qu'un déclencheur a échoué ou qu'un processus a été mis à jour.
Les Webhooks permettent aux systèmes externes de s'abonner aux différents types d'événements Orchestrator et de les écouter. La page Webhooks (Webhooks) permet de les configurer facilement et d'afficher ceux auparavant créés. Vous pouvez également désactiver des Webhooks, rechercher un spécifique, les modifier ou les supprimer.
Les événements sont disponibles pour les tâches, les robots, les files d'attente, les éléments de file d'attente et les déclencheurs.
Chaque événement envoie une charge utile à une URL spécifiée contenant des informations. Certaines propriétés sont communes à tous, tandis que d'autres sont spécifiques à chaque type d'événement.
Les événements Webhook sont créés par dossier : ainsi, lorsqu’un événement Webhook est associé à une ressource partagée entre plusieurs dossiers telle qu’une file d’attente, un événement Webhook distinct sera généré pour chacun de ces dossiers.
Si la demande de transfert d’un événement échoue, le déclencheur de ce Webhook s’ouvre, désactivant le Webhook pendant une heure.
- Tous les événements de Webhook qui auraient dû être envoyés alors que le déclencheur est ouvert sont ignorés et ne sont pas réessayés une fois le déclencheur fermé.
- Les événements de Webhook ne sont pas stockés et ne peuvent pas être réessayés ou exportés. Par ailleurs, si l’appel à la plate-forme externe échoue, l’événement est perdu. Les Webhooks sont conçus pour un traitement en temps réel.
Nom de la propriété |
Type de propriété |
Description et exemple |
---|---|---|
Saisie de texte |
string |
Le type d'événement qui a déclenché la notification. Cette propriété s'affiche pour tous les types d'événements. Exemple :
|
EventID |
string |
Un identificateur généré de façon unique pour chaque événement lorsqu'il se produit. Cette propriété s'affiche pour tous les types d'événements. Exemple :
|
Horodatage |
Date RFC 8601 |
La date et heure de génération de l'événement. Cette propriété s'affiche pour tous les types d'événements. Exemple :
|
TenantId |
Integer |
L'ID du locataire sur lequel l'événement a été généré. Le locataire par défaut est 1. Cette propriété s'affiche pour tous les types d'événements. Exemple :
|
UserId |
Integer |
L'ID utilisateur dont l'action a déclenché l'événement. Ce paramètre ne s'affiche pas si l'événement est déclenché par un robot ou un déclencheur. Cette propriété s'affiche pour tous les types d'événements. Exemple :
|
FolderID |
Integer |
L’ID du dossier dans lequel l’événement a été généré. Ce paramètre ne s'affiche pas pour les événements déclenchés des robots modernes. Exemple :
|
Pour pouvoir effectuer diverses opérations sur la page Webhooks (Webhooks), les autorisations correspondantes doivent vous être accordées sur les Webhooks :
- Consultation (View) : permet de consulter les Webhooks et leurs détails, ainsi que les récupérer à l'aide de l'API, envoyer une requête de ping ou obtenir la liste de tous les événements auxquels un Webhook peut s'abonner.
- Création (Create) : cette autorisation permet d'ajouter des Webhooks. Notez que vous avez également besoin des autorisations de Consultation (View).
- Modifier (Edit) - vous accorde le droit de modifier les webhooks à partir de l'interface utilisateur ou en utilisant l'API. Notez que vous avez également besoin des autorisations Consultation (View).
- Suppression (Delete) : autorisation qui permet de supprimer les Webhooks. Notez que vous avez également besoin des autorisations de Consultation (View).
X-UiPath-Signature
.
Les applis clientes qui reçoivent des requêtes d'Orchestrator doivent vérifier l'authenticité des requêtes. La signature de la requête suit le modèle suivant :
- L'appli cliente reçoit une requête du Webhook d'Orchestrator ;
- L'appli cliente calcule une signature en fonction de la requête ;
-
L'appli cliente tente de faire correspondre la signature qu'il a calculée avec la signature de la requête :
- Si les signatures ne correspondent pas, l'appli cliente ne doit pas traiter la requête.
- Si elles correspondent, la requête doit être traitée.
Le calcul de la signature doit être effectué comme suit :
- Récupérez l'en-tête HTTP
X-UiPath-Signature
. - Pour obtenir des octets de signature bruts, décodez la valeur de l'en-tête de Base64.
-
Récupérez le corps brut de la requête.
Remarque : Les requêtes d'Orchestrator sont toujours encodées à l'aide d'UTF-8. - Calculez le hachage à l'aide de SHA256 et de la clé de signature (encodé en UTF-8).
-
Comparez la signature calculée avec la valeur de l'en-tête HTTP
X-UiPath-Signature
:- Si les signatures ne correspondent pas, ne traitez pas la requête.
- Si elles correspondent, la requête doit être traitée.
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);
}
}
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)
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)