İçeriğe geç

Kılavuzlar

Webhook'lar

Bir webhook uç noktası, bir çalışma alanının uyarı kurallarının ona yönlendirdiklerini alır: engellenen bir sürüm, bir kişiyi bekleyen bir sonuç, sona eren yönetilen bir çalıştırma, bir üretim izleyicisinin alarmı. Her teslimat, uç noktanın sırrıyla imzalanmış bir JSON gövdesidir; böylece sunucunuz, harekete geçmeden önce bunun çalışma alanınızdan geldiğini doğrulayabilir.

Bir uç nokta ekleyin

Çalışma alanının Integrations sayfasında bir Owner veya Admin, bir ad ve 443 veya 8443 numaralı bağlantı noktasında herkese açık bir https URL'si ile imzalı bir webhook ekler. Sayfa ardından uç noktanın whsec_ ile başlayan imzalama sırrını gösterir. O anda kopyalayın: şifrelenmiş olarak saklanır ve bir daha gösterilmez. Değiştirmek için uç noktayı silip yeniden ekleyin.

Ardından Alerts sayfasında uç noktayı bir veya daha fazla kuralın kanalı olarak seçin. "Send a test" bir oloproof.test teslimatı gönderir ve sunucunuzun yanıt verdiği durumu gösterir.

Ne gönderilir

{
  "type": "oloproof.gate_blocked",
  "id": "dlv_8c1f0a2b3c4d5e6f7a8b9c0d",
  "created_at": "2026-10-26T14:03:00.000Z",
  "workspace": "acme",
  "rule": { "id": "rul_1a2b3c4d5e6f7a8b9c0d1e2f", "name": "Do not ship" },
  "event": "gate_blocked",
  "items": [
    {
      "project": "support",
      "kind": "run",
      "id": "run_20261026T140100_4f2a",
      "release_action": "BLOCK",
      "rules": [["faithfulness", "FAIL"]],
      "href": "https://oloproof.com/app/workspaces/acme/projects/support/runs/run_20261026T140100_4f2a"
    }
  ],
  "more": 0
}

Bir öğe kimlikleri, motorun karar durumlarını, sürüm eylemini, bir işin durumunu ve sonucunu, bir izleyicinin motorun yazdığı şekliyle düzeyini, eşiğini ve aralığını ve bağlantıları taşır. Bir vakanın girdisini, çıktısını, beklenen yanıtını veya etiketlerini asla taşımaz. Bir teslimat en fazla 50 öğe içerir; more bunların ötesindeki olayları sayar.

Bir teslimatı doğrulayın

Her teslimat, Standard Webhooks biçiminde üç başlık taşır:

  • webhook-id: teslimatın kimliği, her yeniden denemede aynıdır.
  • webhook-timestamp: bu denemenin ne zaman gönderildiği, 1970'ten bu yana saniye cinsinden.
  • webhook-signature: v1, ve sırrın baytlarıyla (whsec_ sonrasındaki kısım, base64 ile çözülmüş) anahtarlanmış, id.timestamp.body üzerinden hesaplanan base64 HMAC-SHA256.

İmzayı alındığı haliyle ham gövde üzerinden hesaplayın, sabit sürede karşılaştırın ve saatinizden beş dakikadan fazla sapan bir zaman damgasını reddedin.

import base64, hashlib, hmac, time

def verify(secret: str, headers: dict, body: bytes) -> bool:
    key = base64.b64decode(secret.removeprefix("whsec_"))
    msg = f"{headers['webhook-id']}.{headers['webhook-timestamp']}.".encode() + body
    expected = base64.b64encode(hmac.new(key, msg, hashlib.sha256).digest()).decode()
    fresh = abs(time.time() - int(headers["webhook-timestamp"])) <= 300
    given = [part.split(",", 1)[-1] for part in headers["webhook-signature"].split()]
    return fresh and any(hmac.compare_digest(expected, sig) for sig in given)
import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(secret, headers, body) {
  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const id = headers["webhook-id"], ts = headers["webhook-timestamp"];
  const expected = createHmac("sha256", key).update(`${id}.${ts}.${body}`).digest("base64");
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) <= 300;
  return fresh && headers["webhook-signature"].split(" ").some((part) => {
    const sig = Buffer.from(part.split(",").pop());
    return sig.length === expected.length && timingSafeEqual(sig, Buffer.from(expected));
  });
}

Standard Webhooks kitaplıkları aynı başlıkları doğrular.

Teslimat

On saniye içinde herhangi bir 2xx durumuyla yanıt verin. Bir yönlendirme dahil diğer her şey başarısız bir denemedir; 1, 5, 30, 120 ve 360 dakika sonra yeniden denenir ve ardından vazgeçilir. Sunucunuz harekete geçtikten sonra bir yanıt kaybolabileceği için aynı teslimat iki kez gelebilir: bir tekrarı atmak için webhook-id kullanın. Bir kural her olay için en fazla bir kez tetiklenir, bu yüzden yeni bir kimlik yeni bir teslimattır.

Her denemeden önce uç noktanın adı yeniden çözümlenir ve istek yalnızca herkese açık bir adrese gider: loopback, özel, link-local, paylaşılan, ayrılmış ve bulut meta veri adresleri ile bunlardan birini taşıyan IPv6 biçimleri reddedilir. Bağlantı, denetlenen adrese kurulur ve sertifika ada göre denetlenir.

Slack

Bir Slack uç noktası, bir gelen webhook URL'sidir. Her olay için bir satır olan, her sonuca bir bağlantı içeren kısa bir İngilizce ileti alır. Slack, yine de gönderilen imza başlıklarını denetlemez.