Eduki nagusira joan

Webhook sinadura-egiaztapena

vitalera-ren osasun APIko webhook eskaera bakoitzak sinadura kriptografiko bat biltzen du, karga benetakoa dela eta ez dela manipulatua egiaztatzeko. Hau funtsezkoa da urruneko pazienteen monitorizazio integrazioetarako, non webhook kargek datu kliniko sentikorrak daramatzaten, hala nola pazienteen bizi-konstanteak, alarma-aktibatzaileak eta adostasun-aldaketak.

Nola funtzionatzen du

  1. Webhook amaiera-puntu bat konfiguratzen duzunean, gako sekretu bat ezartzen duzu zure erakundearen ezarpenetan.
  2. vitalera-k eskaeraren gorputz gordinaren HMAC-SHA256 sinadura kalkulatzen du zure gako sekretuarekin.
  3. Sinadura x-webhook-humanai-signature HTTP goiburuan sartzen da.
  4. Zure aplikazioak sinadura birkalkulatzen du eta goiburuaren balioarekin konparatzen du.

Egiaztapen-urratsak

  1. Atera x-webhook-humanai-signature goiburua sarrerako eskaeratik.
  2. Irakurri eskaeraren gorputz gordina byte gisa (JSON analisiaren aurretik).
  3. Kalkulatu gorputz gordinaren HMAC-SHA256 laburpena zure webhook sekretuarekin.
  4. Konparatu kalkulatutako sinadura goiburuaren balioarekin denbora-konstanteko konparazio funtzio bat erabiliz denbora-erasoak saihesteko.
  5. Sinadurak bat badatoz, karga benetakoa da. Bestela, baztertu eskaera.

Kode-adibideak

Python

import hmac
import hashlib

def verify_webhook(request_body: bytes, signature_header: str, secret: str) -> bool:
"""Verify the authenticity of a vitalera webhook payload."""
expected_signature = hmac.new(
key=secret.encode("utf-8"),
msg=request_body,
digestmod=hashlib.sha256,
).hexdigest()

return hmac.compare_digest(expected_signature, signature_header)


# Usage in a Flask endpoint
from flask import Flask, request, abort

app = Flask(__name__)
WEBHOOK_SECRET = "your-webhook-secret"

@app.route("/webhooks/vitalera", methods=["POST"])
def handle_webhook():
signature = request.headers.get("x-webhook-humanai-signature", "")
if not verify_webhook(request.data, signature, WEBHOOK_SECRET):
abort(401, "Invalid signature")

payload = request.get_json()
event_type = payload["event_type"]

# Process the event
print(f"Received event: {event_type}")
return "", 200

Node.js

const crypto = require('crypto');

function verifyWebhook(rawBody, signatureHeader, secret) {
const expectedSignature = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');

return crypto.timingSafeEqual(Buffer.from(expectedSignature), Buffer.from(signatureHeader));
}

// Usage in an Express endpoint
const express = require('express');
const app = express();

const WEBHOOK_SECRET = 'your-webhook-secret';

app.post('/webhooks/vitalera', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['x-webhook-humanai-signature'] || '';

if (!verifyWebhook(req.body, signature, WEBHOOK_SECRET)) {
return res.status(401).send('Invalid signature');
}

const payload = JSON.parse(req.body);
console.log(`Received event: ${payload.event_type}`);
res.sendStatus(200);
});

app.listen(3000);

Segurtasun-jardunbide onak

  • Beti egiaztatu sinadurak webhook datuak prozesatu aurretik. Inoiz ez fidatu egiaztatu gabeko kargetatik.
  • Erabili denbora-konstanteko konparazioa (hmac.compare_digest Python-en, crypto.timingSafeEqual Node.js-en) denbora-erasoak saihesteko.
  • Irakurri gorputz gordina JSON analisiaren aurretik. JSON analisi eta birseriatzeak zuriuneak edo gakoen ordena alda ditzakete, sinadura baliogabetuz.
  • Erabili HTTPS amaiera-puntuak webhook kargak garraioan babesteko.
  • Biratu sekretuak aldizka eta eguneratu zure webhook konfigurazioa egiten duzunean.
  • Baztertu berrerreproduzitutako eskaerak kargako timestamp eremua egiaztatuz eta arrazoizko leiho bat baino zaharragoak diren gertaerak baztertuz (adib., 5 minutu).

Arazoak konpontzea

ArazoaKonponbidea
Sinadura ez dator batZiurtatu eskaeraren gorputzaren byte gordinak hasheatzen ari zarela, ez analisi/birseriatu ondoko bertsio bat.
Sinadura-goiburu hutsaEgiaztatu zure webhook konfiguraziorak gako sekretua biltzen duela.
Tartekako egiaztapen-hutsegiteakZiurtatu zure web framework-ak ez duela eskaeraren gorputza aldatzen zuk irakurri aurretik.

Hurrengo urratsak