Verificación de firma
Valida X-Nahui-Signature-256 con HMAC SHA-256, Base64URL sin padding y comparación en tiempo constante.
Verifica la firma sobre los bytes exactos del cuerpo recibido, antes de ejecutar
JSON.parse o cualquier parser equivalente.Encabezado
X-Nahui-Signature-256: sha256=BASE64URL_SIN_PADDINGAlgoritmo
- Conserva los bytes exactos del cuerpo recibido.
- Calcula HMAC SHA-256 usando el secreto
nhs_...como clave. - Codifica el resultado en Base64URL sin
=al final. - Agrega el prefijo
sha256=. - Compara en tiempo constante con el encabezado recibido.
- Solo después de validar ejecuta
JSON.parse.
esperada = "sha256=" + base64url_sin_padding(
hmac_sha256(NAHUI_WEBHOOK_SECRET, RAW_BODY)
)Si falta el encabezado o no coincide, responde 401 y no proceses el evento.
Patrón correcto
const rawBody = await request.text();
verifySignature(rawBody, request.headers.get('x-nahui-signature-256'));
const event = JSON.parse(rawBody);Patrón incorrecto
const event = await request.json();
const rawBody = JSON.stringify(event);
// La serialización puede cambiar y romper o debilitar la validación.Además de firma, valida el esquema del evento y deduplica por deliveryId antes de ejecutar efectos externos.