Webhook
Notifikasi bertanda tangan yang dikirim Atlas ke situs web Anda saat konten diterbitkan, sehingga Anda dapat menyegarkan tepat halaman yang terdampak.
Halaman ini diterjemahkan dari bahasa Inggris. Jika ada perbedaan, versi bahasa Inggris yang berlaku. Baca dalam bahasa Inggris
Buat webhook di Studio pada Integrations → Webhooks. Masing-masing memiliki URL HTTPS, peristiwa yang diterimanya, dan rahasia penandatanganan yang diawali whsec_, ditampilkan satu kali.
Atlas hanya mengirim ke alamat HTTPS publik. Alamat jaringan privat ditolak; HTTP biasa hanya diizinkan ke localhost selama Anda mengembangkan.
Permintaan
Section titled “Permintaan”POST https://your-site.example/api/atlas/webhookContent-Type: application/jsonX-Atlas-Event: content.page.publishedX-Atlas-Delivery: <unique delivery id>X-Atlas-Signature: t=1761210000,v1=5f2b…Verifikasi setiap permintaan
Section titled “Verifikasi setiap permintaan”import { createHmac, timingSafeEqual } from 'node:crypto';import { revalidatePath, revalidateTag } from 'next/cache';
const seen = new Set<string>(); // use a shared store (Redis, KV) when you run several instances
export async function POST(request: Request) { const body = await request.text(); // the raw body, before any JSON parsing const header = request.headers.get('x-atlas-signature') ?? ''; const parts = Object.fromEntries(header.split(',').map((part) => part.split('=', 2))); const timestamp = Number(parts.t);
if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return new Response(null, { status: 400 });
const expected = createHmac('sha256', process.env.ATLAS_WEBHOOK_SECRET!) .update(`${timestamp}.${body}`) .digest(); const given = Buffer.from(String(parts.v1 ?? ''), 'hex'); if (given.length !== expected.length || !timingSafeEqual(given, expected)) { return new Response(null, { status: 401 }); }
const delivery = request.headers.get('x-atlas-delivery') ?? ''; if (seen.has(delivery)) return new Response(null, { status: 200 }); // already handled seen.add(delivery);
const payload = JSON.parse(body); // e.g. { pageId, route, revision } for content.page.published if (typeof payload.route === 'string') revalidatePath(payload.route); else revalidateTag('atlas'); // entries, globals, translations: refresh everything tagged 'atlas' return new Response(null, { status: 200 });}Pemeriksaan, secara berurutan:
- Gunakan body permintaan mentah.
- Tolak timestamp yang lebih dari 5 menit lalu.
- Hitung
HMAC-SHA256("<t>.<raw body>")dengan rahasia penandatanganan Anda dan bandingkan dalam waktu konstan. - Abaikan id
X-Atlas-Deliveryyang berulang.
Catat jenis peristiwa dan id pengiriman dalam log, jangan pernah body atau rahasianya.
Peristiwa
Section titled “Peristiwa”Body permintaan adalah payload peristiwa. Untuk content.page.published isinya { "pageId", "route", "revision" }. Jenis peristiwa ada di header X-Atlas-Event.
Webhook disiapkan sekali, di Development, dan juga menerima peristiwa dari situs web live. Setiap payload memiliki environment: "development" atau "production", sehingga Anda dapat membedakannya.
| Peristiwa | Kapan |
|---|---|
content.page.published |
Sebuah halaman diterbitkan atau dikembalikan |
content.page.unpublished |
Sebuah halaman diturunkan dari situs web |
content.page.route.changed |
Sebuah halaman pindah ke alamat baru (pengalihan ditambahkan) |
content.entry.published |
Sebuah entri koleksi diterbitkan |
content.entry.unpublished |
Sebuah entri koleksi diturunkan dari situs web |
content.global.published |
Header, footer, atau global lain diterbitkan |
content.translation.published |
Sebuah terjemahan diterbitkan |
contract.activated |
Kontrak situs baru diaktifkan |
seo.redirects.changed |
Pengalihan berubah |
media.asset.uploaded |
Sebuah file media diunggah |
form.published |
Sebuah formulir diterbitkan |
form.submission.accepted |
Sebuah kiriman formulir diterima |
lead.created |
Lead baru masuk (hanya id, tanpa data pribadi) |
lead.merged |
Sebuah lead digabungkan ke lead lain (hanya id) |
bot.published |
Sebuah chatbot diterbitkan |
Atlas menunggu hingga 10 detik untuk respons Anda dan tidak mengikuti pengalihan. Gunakan riwayat pengiriman di Studio untuk memeriksa payload dan kegagalan.