- Primeros pasos
- Mejores prácticas
- Tenant
- Acciones
- Contexto de carpetas
- Automatizaciones
- Procesos
- Trabajos
- Desencadenadores
- Registros
- Supervisión
- Colas
- Activos
- Depósitos de almacenamiento
- Test Suite - Orchestrator
- Catálogos de acciones
- Perfil
- Administrador de sistema
- Servidor de identidad
- Autenticación
- Otras configuraciones
- Integraciones
- Robots clásicos
- Solución de problemas
Guía del usuario de Orchestrator
Webhooks
Webhooks le permite integrar mejor su automatización de UiPath con todo su ecosistema de aplicaciones. Puede suscribirse a los eventos de Orchestrator y enviarlos a cualquier solución externa de DCM, BPM o CRM e informar a los diferentes usuarios, por ejemplo, de que hay un nuevo artículo en cola que se puede procesar, que un desencadenador ha fallado o que un proceso se ha actualizado.
Los webhooks permiten que sistemas externos se suscriban y escuchen diferentes tipos de eventos de Orchestrator. La página Webhooks te permite configurarlos fácilmente y ver los que se hayan creado anteriormente. También puedes deshabilitar webhooks, buscar uno específico, editarlos o eliminarlos.
Los eventos están disponibles para trabajos, robots, colas, elementos de cola, procesos y desencadenadores. Para ver la lista completa de tipos de evento y unos ejemplos, consulta esta página.
Cada evento envía una carga útil a una URL especificada que contiene información. Algunas propiedades son comunes para todos, mientras que otras son particulares para cada tipo de evento.
Nombre de propiedad |
Tipo de propiedad |
Descripción y ejemplo |
---|---|---|
Tipo |
String |
El tipo de evento que desencadenó la notificación. Esta propiedad se muestra para todos los tipos de eventos. Ejemplo:
|
IDDeEvento |
String |
Un identificador generado de forma única para cada evento cuando este ocurre. Esta propiedad se muestra para todos los tipos de eventos. Ejemplo:
|
Marca de tiempo |
Fecha RFC 8601 |
La fecha y hora en que se generó el evento. Esta propiedad se muestra para todos los tipos de eventos. Ejemplo:
|
IDdeTenant |
Entero |
El ID del tenant en el que se generó el evento. El tenant predeterminado es 1. Esta propiedad se muestra para todos los tipos de eventos. Ejemplo:
|
ID de usuario |
Entero |
El ID de usuario cuya acción ha desencadenado el evento. Este parámetro no se muestra si el evento es desencadenado por un Robot o un desencadenador. Esta propiedad se muestra para todos los tipos de eventos. Ejemplo:
|
IDDeCarpeta |
Entero |
El ID de la carpeta en la que se ha generado el evento. Este parámetro no se muestra para los eventos desencadenados por robots modernos. Ejemplo:
|
Para realizar varias operaciones en la página Webhooks, debes tener los permisos correspondientes en Webhooks:
- Ver: permite ver los Webhooks y sus detalles, así como recuperarlos mediante la API, enviar una solicitud de ping, u obtener la lista de todos los eventos a los que puede suscribirse un Webhook.
- Crear: este permiso te permite añadir nuevos webhooks. Ten en cuenta que también necesitarás permisos de visualización.
- Editar - te otorga derechos de editar webhooks desde la IU o utilizando la API. Ten en cuenta que también necesitarás permisos de visualización.
- Eliminar: un permiso que te permite eliminar webhooks. Ten en cuenta que también necesitarás permisos de visualización.
X-UiPath-Signature
HTTP.
Las aplicaciones de cliente que reciban solicitudes de Orchestrator deben comprobar la autenticidad de las solicitudes. La firma de la solicitud sigue el siguiente patrón:
- La aplicación cliente recibe una solicitud de Webhook de Orchestrator;
- La aplicación cliente calcula una firma basada en la solicitud;
-
La aplicación cliente intenta hacer coincidir la firma que ha calculado con la firma de la solicitud:
- Si las firmas no coinciden, la aplicación cliente no debe procesar la solicitud.
- Si las firmas coinciden, la aplicación cliente debe procesar la solicitud.
El cálculo de la firma debe hacerse de la siguiente manera:
- Recupera el encabezado HTTP
X-UiPath-Signature
. - Para obtener los bytes de la firma en bruto, decodifica el valor del encabezado desde Base64.
-
Recupera el cuerpo de la solicitud sin procesar.
Nota: Las solicitudes de Orchestrator siempre se codifican utilizando UTF-8. - Calcula el hash utilizando SHA256 y la clave de firma (codificada en UTF-8).
-
Compara la firma calculada con el valor del encabezado HTTP
X-UiPath-Signature
:- Si las firmas no coincidan, no proceses la solicitud.
- Si las firmas coinciden, la aplicación cliente debe procesar la solicitud.
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)