Tengo 2 microservicios nodejs (llamémoslos servicio x y servicio y). En el servicio x, haré solicitudes POST al servicio y.
Digamos que el servicio x publicará en este punto final HTTPs en el servicio y: /order/orderId
Pienso en el servicio x como productor de webhooks y en el servicio y como consumidor de webhooks.
Quiero que el servicio y pueda garantizar que el mensaje proviene del servicio x y no de una fuente maliciosa. Para que esto funcione, quiero firmar solicitudes dentro del servicio x antes de que haga una solicitud POST al servicio y.
¿Qué opciones tengo para firmar estas solicitudes? ¿Cómo puedo firmar estas solicitudes en el servicio x y cómo valido estas solicitudes en el servicio y? Además, ¿qué opciones de firma/cifrado tengo?
Los ejemplos de código concretos en nodejs serán de gran ayuda.
Puede usar una clave secreta entre los dos servicios exclusivamente y usarla para firmar las solicitudes.
En el remitente (servicio x):
x-webhook-signature , que será un sha256 HMAC generado usando la clave secreta: function createHmacSignature(req) { return require("crypto") .createHmac("sha256", secretKey) .update(JSON.stringify(req.body)) .digest("hex"); }En el receptor (servicio y):
req.headers["x-webhook-signature"]HMAC nuevamente como se indicó anteriormente.x-webhook-signature , si coinciden, el origen de la solicitud sería el esperado. function compareSignatures (signature, comparison_signature) { const source = Buffer.from(signature); const comparison = Buffer.from(comparison_signature); return require("crypto").timingSafeEqual(source, comparison); }Por supuesto, se pueden realizar validaciones y mejoras adicionales, este es el flujo normal para garantizar que solo el servicio x pueda enviar la solicitud.