Orchestrator
2023.4
False
Imagen de fondo del banner
Guía del usuario de Orchestrator
Última actualización 19 de abr. de 2024

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 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.

Propiedades comunes de carga útil

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:

"Type": "job.created"

"Type":"process.updated"

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:

"EventId":"3e5af0113e674ae597c579cb35ed8630"

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:

"Timestamp":"2018-11-02T11:47:48.5790797Z"

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:

"TenantId":3

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:

"UserId": 4947

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:

"FolderId": 26

Permisos

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 para Ver.
  • Eliminar: un permiso que te permite eliminar webhooks. Ten en cuenta que también necesitarás permisos de visualización.

Autenticación

Todas las solicitudes HTTP de webhook utilizan el secreto que añadiste al crear un webhook para autenticar. Se combina con el cuerpo de la solicitud utilizando un hash con clave HMAC-SHA256. Esto produce una firma segura que no contiene ninguna información secreta, es única para cada solicitud y se envía mediante el encabezado 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:

  1. Recupera el encabezado HTTP X-UiPath-Signature.
  2. Para obtener los bytes de la firma en bruto, decodifica el valor del encabezado desde Base64.
  3. Recupera el cuerpo de la solicitud sin procesar.

    Nota: Las solicitudes de Orchestrator siempre se codifican utilizando UTF-8.
  4. Calcula el hash utilizando SHA256 y la clave de firma (codificada en UTF-8).
  5. 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.

Ejemplos de validación de firmas

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)
  • Propiedades comunes de carga útil
  • Permisos
  • Autenticación
  • Ejemplos de validación de firmas

Was this page helpful?

Obtén la ayuda que necesitas
RPA para el aprendizaje - Cursos de automatización
Foro de la comunidad UiPath
Logotipo blanco de UiPath
Confianza y seguridad
© 2005-2024 UiPath. All rights reserved.