Pengiriman kejadian webhook

Webhook adalah salah satu dari banyak cara untuk menerima acara dari Azure Event Grid. Ketika peristiwa baru siap, layanan Event Grid memPOST permintaan HTTP ke titik akhir yang dikonfigurasi dengan informasi peristiwa di isi permintaan.

Seperti banyak layanan lain yang mendukung webhook, Event Grid mengharuskan Anda membuktikan kepemilikan titik akhir Webhook Anda sebelum mulai mengirimkan acara ke titik akhir tersebut. Persyaratan ini mencegah pengguna berbahaya membanjiri titik akhir Anda dengan acara.

Validasi Titik Akhir dengan acara Event Grid

Saat Anda menggunakan salah satu dari tiga layanan Azure berikut, infrastruktur Azure secara otomatis menangani validasi ini:

Jika menggunakan jenis titik akhir lainnya, seperti fungsi Azure berbasis pemicu HTTP, kode titik akhir Anda perlu berpartisipasi dalam jabat tangan validasi dengan Event Grid. Event Grid mendukung dua cara untuk memvalidasi langganan.

  • Jabat tangan sinkron: Pada saat pembuatan langganan peristiwa, Event Grid mengirimkan peristiwa validasi langganan ke titik akhir Anda. Skema acara ini mirip dengan acara Event Grid lainnya. Bagian data acara ini mencakup properti validationCode. Aplikasi Anda memverifikasi bahwa permintaan validasi adalah untuk langganan acara yang diharapkan, dan membalas kode validasi sebagai respons secara sinkron. Mekanisme jabat tangan ini didukung di semua versi Event Grid.

  • Jabat tangan asinkron: Dalam kasus tertentu, Anda tidak dapat membalas validationCode sebagai respons secara sinkron. Misalnya, jika Anda menggunakan layanan pihak ketiga (seperti Zapier atau IFTTT), Anda tidak dapat merespons secara terprogram dengan kode validasi.

    Event Grid mendukung jabat tangan validasi manual. Jika Anda membuat langganan acara dengan SDK atau alat yang menggunakan API versi 2018-05-01-preview atau yang lebih baru, Event Grid akan mengirimkan properti validationUrl di bagian data acara validasi langganan. Untuk menyelesaikan jabat tangan, temukan URL itu di data acara, lalu lakukan permintaan DAPATKAN ke URL tersebut. Anda dapat menggunakan klien REST atau browser web.

    URL yang disediakan berlaku selama 10 menit. Selama durasi tersebut, status penyediaan langganan acara adalah AwaitingManualAction. Jika Anda tidak menyelesaikan validasi manual dalam waktu 10 menit, status provisi diatur ke Failed. Anda harus membuat langganan peristiwa lagi sebelum memulai validasi manual.

    Mekanisme autentikasi ini juga mengharuskan titik akhir webhook membalas kode status HTTP 200 sehingga tahu bahwa KIRIMAN untuk acara validasi tersebut diterima sebelum dapat dimasukkan ke dalam mode validasi manual. Dengan kata lain, jika titik akhir membalas 200 tetapi tidak membalas respons validasi secara sinkron, mode tersebut dialihkan ke mode validasi manual. Jika ada GET pada URL validasi dalam waktu 10 menit, jabat tangan validasi dianggap berhasil.

Catatan

Menggunakan sertifikat yang ditandatangani sendiri untuk validasi tidak didukung. Gunakan sertifikat yang ditandatangani otoritas sertifikat komersial (CA) sebagai gantinya.

Detail validasi

  • Pada saat pembuatan/pembaruan langganan acara, Event Grid memposting acara validasi langganan ke titik akhir target.
  • Peristiwa berisi nilai header aeg-event-type: SubscriptionValidation.
  • Isi acara memiliki skema yang sama dengan acara Event Grid lainnya.
  • Properti eventType dari peristiwa tersebut adalah Microsoft.EventGrid.SubscriptionValidationEvent.
  • Properti data dari peristiwa tersebut mencantumkan validationCode properti dengan untai (karakter) yang dihasilkan secara acak. Contohnya,validationCode: acb13….
  • Data acara juga menyertakan properti validationUrl dengan URL untuk memvalidasi langganan secara manual.
  • Larik hanya berisi acara validasi. Acara lain dikirim dalam permintaan terpisah setelah Anda membalas kode validasi.
  • SDK EventGrid DataPlane memiliki kelas yang sesuai dengan data peristiwa validasi langganan dan respons validasi langganan.

Contoh SubscriptionValidationEvent ditunjukkan dalam contoh berikut:

[
  {
    "id": "2d1781af-3a4c-4d7c-bd0c-e34b19da4e66",
    "topic": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "subject": "",
    "data": {
      "validationCode": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6",
      "validationUrl": "https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/myeventsub/validate?id=0000000000-0000-0000-0000-00000000000000&t=2022-10-28T04:23:35.1981776Z&apiVersion=2018-05-01-preview&token=1A1A1A1A"
    },
    "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent",
    "eventTime": "2022-10-28T04:23:35.1981776Z",
    "metadataVersion": "1",
    "dataVersion": "1"
  }
]

Untuk membuktikan kepemilikan titik akhir, balas kode validasi di dalam validationResponse properti validationResponse, seperti yang ditunjukkan dalam contoh berikut:

{
  "validationResponse": "512d38b6-c7b8-40c8-89fe-f46f9e9622b6"
}

Dan, ikuti salah satu langkah berikut:

  • Anda harus membalas kode status respons HTTP 200 OK. HTTP 202 Diterima tidak dikenali sebagai respons validasi langganan Event Grid yang valid. Permintaan HTTP harus diselesaikan dalam waktu 30 detik. Jika tidak selesai dalam 30 detik, maka operasi tersebut akan dibatalkan dan akan dicoba ulang setelah 5 detik. Jika semua upaya gagal, maka itu diperlakukan sebagai kesalahan jabat tangan validasi.

    Fakta bahwa aplikasi Anda siap untuk menangani dan mengembalikan kode validasi menunjukkan bahwa Anda membuat langganan peristiwa dan diharapkan menerima peristiwa tersebut. Bayangkan skenario bahwa tidak ada validasi jabat tangan yang didukung dan peretas mengenal URL aplikasi Anda. Peretas dapat membuat topik dan langganan peristiwa dengan URL aplikasi Anda, dan mulai melakukan serangan DoS ke aplikasi Anda dengan mengirim banyak peristiwa. Validasi jabat tangan mencegah hal itu terjadi.

    Bayangkan bahwa Anda sudah memiliki validasi yang diterapkan di aplikasi Anda karena Anda membuat langganan peristiwa Anda sendiri. Bahkan jika peretas membuat langganan peristiwa dengan URL aplikasi Anda, implementasi peristiwa permintaan validasi yang benar memeriksa aeg-subscription-name header dalam permintaan untuk memastikan bahwa itu adalah langganan peristiwa yang Anda kenali.

    Bahkan setelah implementasi jabat tangan yang benar, peretas dapat membanjiri aplikasi Anda (sudah memvalidasi langganan peristiwa) dengan mereplikasi permintaan yang tampaknya berasal dari Event Grid. Untuk mencegahnya, Anda harus mengamankan webhook Anda dengan autentikasi Microsoft Entra. Untuk informasi selengkapnya, lihat Mengirimkan peristiwa ke titik akhir yang dilindungi Microsoft Entra.

  • Atau, Anda dapat memvalidasi langganan secara manual dengan mengirim permintaan DAPATKAN ke URL validasi. Langganan acara tetap dalam status tertunda hingga divalidasi. Url validasi menggunakan port 553. Jika aturan firewall Anda memblokir port 553, Anda perlu memperbarui aturan untuk jabat tangan manual yang berhasil.

    Dalam validasi peristiwa validasi langganan, jika Anda mengidentifikasi bahwa itu bukan langganan peristiwa yang Anda harapkan peristiwanya, Anda tidak akan mengembalikan respons 200 atau tidak ada respons sama sekali. Oleh karena itu, validasi gagal.

Untuk contoh penanganan jabat tangan validasi langganan, lihat sampel C#.

Validasi titik akhir dengan CloudEvents v1.0

CloudEvents v1.0 mengimplementasikan semantik perlindungan penyalahgunaannya sendiri menggunakan metode OPSI HTTP. Baca lebih lanjut mengenai hal tersebut di sini. Saat Anda menggunakan skema CloudEvents untuk output, Event Grid menggunakan perlindungan penyalahgunaan CloudEvents v1.0 sebagai menggantikan mekanisme peristiwa validasi Event Grid.

Kompatibilitas skema peristiwa

Ketika topik dibuat, skema peristiwa yang akan masuk ditentukan. Lalu, ketika langganan dibuat, skema peristiwa yang akan keluar ditentukan. Tabel berikut menunjukkan kompatibilitas yang diizinkan saat membuat langganan.

Skema peristiwa masuk Skema peristiwa keluar Didukung
Skema Azure Event Grid Skema Azure Event Grid Ya
Skema Cloud Events v1.0 Ya
Skema input kustom No
Skema Cloud Events v1.0 Skema Azure Event Grid No
Skema Cloud Events v1.0 Ya
Skema input kustom No
Skema input kustom Skema Azure Event Grid Ya
Skema Cloud Events v1.0 Ya
Skema input kustom Ya

Langkah berikutnya

Lihat artikel berikut ini untuk mempelajari cara memecahkan masalah validasi langganan peristiwa: Memecahkan masalah validasi langganan peristiwa.