- Primeros pasos
- Mejores prácticas
- Tenant
- Acerca del contexto de tenant
- Buscar recursos en un tenant
- Gestionar robots
- Conexión de los robots a Orchestrator
- Almacenar credenciales de robots en CyberArk
- Almacenar contraseñas de robots desatendidos en Azure Key Vault (solo lectura)
- Almacenar las credenciales de robots desatendidos en HashiCorp Vault (solo lectura)
- Almacenamiento de credenciales de Unattended Robot en AWS Secrets Manager (solo lectura)
- Eliminar sesiones desconectadas y sin respuesta no atendidas
- Autenticación de Robot
- Autenticación de robots con credenciales de cliente
- Configurar las capacidades de automatización
- Auditoría
- Servicio de catálogo de recursos
- Automation Suite Robots
- Contexto de carpetas
- Automatizaciones
- Procesos
- Trabajos
- Apps
- Desencadenadores
- Registros
- Supervisión
- Colas
- Activos
- Depósitos de almacenamiento
- Test Suite - Orchestrator
- Integraciones
- Solución de problemas
Webhooks
Los webhooks te permiten integrar mejor tu automatización de UiPath® con todo tu 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 algunos 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.
Los eventos de Webhook se crean por carpeta, por lo que si tienes un evento de webhook asociado a un recurso que se comparte entre las carpetas, como una cola, se genera un evento de webhook independiente para cada una de esas carpetas.
Si la solicitud para reenviar un evento falla, se abre el disyuntor para ese webhook en particular, deshabilitando el webhook durante una hora.
- Cualquier evento de webhook que debiera haberse enviado mientras el disyuntor está abierto se omite y no se reintenta una vez que se cierra el disyuntor.
- Los eventos de Webhook no se almacenan y no se pueden reintentar o exportar. Además, si la llamada a la plataforma externa falla, el evento se pierde. Los webhooks están diseñados para el procesamiento en tiempo real.
Nombre de propiedad |
Tipo de propiedad |
Descripción y ejemplo |
---|---|---|
Nombre |
String |
El nombre del webhook. Esta propiedad se muestra para todos los tipos de eventos y es obligatoria. 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:
|
Para realizar varias operaciones en la página Webhooks, debes tener los permisos correspondientes en Webhooks:
- Ver: te 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 a través de 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)