- 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
- Almacenamiento de contraseñas de robot desatendido en Azure Key Vault (solo lectura)
- Almacenar las credenciales de robots desatendidos en HashiCorp Vault (solo lectura)
- Eliminar sesiones desconectadas y sin respuesta no atendidas
- Autenticación de Robot
- Autenticación de robots con credenciales de cliente
- Autenticación por SmartCard
- Asignar roles
- Gestionar roles
- Roles por defecto
- Preguntas frecuentes
- Habilitación de usuarios para ejecutar automatizaciones personales
- Habilitación de usuarios para ejecutar automatizaciones en infraestructura desatendida por medio de robots desatendidos
- Configuración de cuentas de robot para ejecutar automatizaciones desatendidas
- Auditoría
- Servicio de catálogo de recursos
- Contexto de carpetas
- Automatizaciones
- Procesos
- Trabajos
- Desencadenadores
- Registros
- Supervisión
- Colas
- Activos
- Depósitos de almacenamiento
- Test Suite - Orchestrator
- Otras configuraciones
- Integraciones
- Robots clásicos
- Administración de host
- About the host level
- Gestionar los administradores del sistema
- Gestión de tenants
- Configuración de las notificaciones por correo electrónico del sistema
- Registros de auditoría para el portal del host
- Modo de mantenimiento
- Administración de la organización
- Solución de problemas
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.
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.
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: 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)