Ekstensi CloudEvents untuk penanganan aktivitas Azure Web PubSub dengan protokol HTTP
Layanan Web PubSub mengirimkan peristiwa klien ke webhook upstream menggunakan pengikatan protokol HTTP CloudEvents.
Data yang dikirim dari layanan Web PubSub ke server selalu dalam format CloudEvents binary
.
- Validasi Webhook
- Ekstensi atribut Web PubSub CloudEvents
- Peristiwa
- Memblokir peristiwa
- Peristiwa sistem
connect
- Peristiwa pengguna
- Peristiwa sistem
- Membuka blokir peristiwa
- Peristiwa sistem
connected
- Peristiwa sistem
disconnected
- Peristiwa sistem
- Memblokir peristiwa
Validasi Webhook
Validasi Webhook mengikuti CloudEvents. Permintaan selalu berisi WebHook-Request-Origin: xxx.webpubsub.azure.com
di header.
Jika dan hanya jika target pengiriman mengizinkan pengiriman peristiwa, itu HARUS membalas permintaan dengan menyertakan header WebHook-Allowed-Origin
, misalnya:
WebHook-Allowed-Origin: *
Atau:
WebHook-Allowed-Origin: xxx.webpubsub.azure.com
Untuk saat ini, WebHook-Request-Rate dan WebHook-Request-Callback tidak didukung.
Ekstensi atribut Web PubSub CloudEvents
Juga dicatat bahwa spesifikasi HTTP sekarang mengikuti pola yang sama dengan tidak lagi menyarankan bahwa header HTTP ekstensi diawali dengan X-.
Ekstensi ini mendefinisikan atribut yang digunakan oleh Web PubSub untuk setiap peristiwa yang dibuat.
Atribut
Nama | Tipe | Deskripsi | Contoh |
---|---|---|---|
userId |
string |
Pengguna koneksi authed | |
hub |
string |
Hub tempat koneksi berada | |
connectionId |
string |
ConnectionId unik untuk koneksi klien | |
eventName |
string |
Nama peristiwa tanpa awalan | |
subprotocol |
string |
Subprotokol yang digunakan klien jika ada | |
connectionState |
string |
Mendefinisikan status untuk koneksi. Anda dapat menggunakan header respons yang sama untuk mengatur ulang nilai status. Beberapa connectionState header tidak diperbolehkan. Lakukan base64 mengodekan nilai string jika berisi karakter kompleks di dalamnya, misalnya, base64(jsonString) untuk meneruskan objek kompleks menggunakan atribut ini. |
|
signature |
string |
Tanda tangan untuk webhook upstram untuk memvalidasi apakah permintaan yang masuk berasal dari asal yang diharapkan. Layanan menghitung nilai menggunakan kunci akses utama dan kunci akses sekunder sebagai HMAC kunci: Hex_encoded(HMAC_SHA256(accessKey, connectionId)) . Upstram harus memeriksa apakah permintaan itu valid sebelum memprosesnya. |
Peristiwa
Ada dua jenis peristiwa. Salah satunya adalah memblokir peristiwa bahwa layanan menunggu respons acara berlanjut. Satu membuka blokir peristiwa yang respons peristiwa tersebut tidak ditunggu oleh layanan sebelum memproses pesan berikutnya.
- Memblokir peristiwa
- Peristiwa sistem
connect
- Peristiwa pengguna
- Peristiwa sistem
- Membuka blokir peristiwa
- Peristiwa sistem
connected
- Peristiwa sistem
disconnected
- Peristiwa sistem
Peristiwa connect
sistem
ce-type
:azure.webpubsub.sys.connect
Content-Type
:application/json
Format permintaan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.connect
ce-source: /hubs/{hub}/client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub}
ce-eventName: connect
{
"claims": {},
"query": {},
"headers": {},
"subprotocols": [],
"clientCertificates": [
{
"thumbprint": "<certificate SHA-1 thumbprint>",
"content": "-----BEGIN CERTIFICATE-----\r\n...\r\n-----END CERTIFICATE-----"
}
]
}
Format respons keberhasilan:
Header
ce-connectionState
: Jika header ini ada, status koneksi dari koneksi ini akan diperbarui ke nilai header. Hanya peristiwa pemblokiran yang dapat memperbarui status koneksi. Sampel di bawah ini menggunakan string JSON yang dikodekan base64 untuk menyimpan status kompleks untuk koneksi.Kode status:
204
: Sukses, tanpa konten.200
: Berhasil, konten HARUS berupa format JSON, dengan properti berikut diizinkan:subprotocols
Peristiwa
connect
meneruskan informasi subprotokol dan autentikasi ke Upstram dari klien. Layanan Web PubSub menggunakan kode status untuk menentukan apakah permintaan akan ditingkatkan ke protokol WebSocket.Jika permintaan berisi properti
subprotocols
, server harus menampilkan satu subprotokol yang didukungnya. Jika server tidak ingin menggunakan subprotokol apa pun, server seharusnya tidak mengirim propertisubprotocol
sebagai respons. Mengirim header kosong tidak valid.userId
:{auth-ed user ID}
Karena layanan ini memungkinkan koneksi anonim, ini adalah tanggung jawab peristiwa
connect
untuk memberi tahu layanan ID pengguna koneksi klien. Layanan membaca ID pengguna dari payloaduserId
respons jika ada. Koneksi dihilangkan jika ID pengguna tidak dapat dibaca dari klaim permintaan atauconnect
payload respons peristiwa.groups
:{groups to join}
Properti ini menyediakan cara yang nyaman bagi pengguna untuk menambahkan koneksi ini ke satu atau beberapa grup. Dengan cara ini, tidak perlu memiliki panggilan lain untuk menambahkan koneksi ini ke beberapa grup.
roles
:{roles the client has}
Properti menyediakan cara bagi Webhook hulu untuk mengotorisasi klien. Ada berbagai peran untuk memberikan izin awal untuk klien WebSocket PubSub. Detail tentang izin dijelaskan dalam Izin klien.
HTTP/1.1 200 OK
ce-connectionState: eyJrZXkiOiJhIn0=
{
"groups": [],
"userId": "",
"roles": [],
"subprotocol": ""
}
Format respons kesalahan:
4xx
: Kesalahan, respons dari Upstram akan ditampilkan sebagai respons atas permintaan klien.
HTTP/1.1 401 Unauthorized
Peristiwa connected
sistem
Layanan ini memanggil Upstram saat klien menyelesaikan jabat tangan WebSocket dan berhasil terhubung.
ce-type
:azure.webpubsub.sys.connected
Content-Type
:application/json
ce-connectionState
:eyJrZXkiOiJhIn0=
Badan permintaan adalah JSON kosong.
Format permintaan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.connected
ce-source: /hubs/{hub}/client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub}
ce-eventName: connected
ce-subprotocol: abc
ce-connectionState: eyJrZXkiOiJhIn0=
{}
Format respons:
2xx
: respons berhasil.
connected
adalah peristiwa asinkron, ketika kode status respons tidak berhasil, layanan mencatat kesalahan.
HTTP/1.1 200 OK
Peristiwa disconnected
sistem
Peristiwa disconnected
selalu dipicu saat permintaan klien selesai jika peristiwa sambungkan menampilkan kode status 2xx
.
ce-type
:azure.webpubsub.sys.disconnected
Content-Type
:application/json
Format permintaan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json; charset=utf-8
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.sys.disconnected
ce-source: /hubs/{hub}/client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub}
ce-eventName: disconnected
ce-subprotocol: abc
ce-connectionState: eyJrZXkiOiJhIn0=
{
"reason": "{Reason}"
}
reason
reason
menjelaskan alasan koneksi klien terputus.
Format respons:
2xx
: respons berhasil.
disconnected
adalah peristiwa asinkron, ketika kode status respons tidak berhasil, layanan mencatat kesalahan.
HTTP/1.1 200 OK
Peristiwa pengguna message
untuk klien WebSocket sederhana
Layanan ini memanggil upstram penanganan peristiwa untuk setiap bingkai pesan WebSocket.
ce-type
:azure.webpubsub.user.message
Content-Type
:application/octet-stream
untuk bingkai biner;text/plain
untuk bingkai teks;
UserPayload adalah apa yang dikirim klien.
Format permintaan:
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/octet-stream | text/plain | application/json
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.message
ce-source: /hubs/{hub}/client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub}
ce-eventName: message
ce-connectionState: eyJrZXkiOiJhIn0=
UserPayload
Format respons keberhasilan
- Kode status
204
: Sukses, tanpa konten.200
: Sukses, formatUserResponsePayload
bergantung padaContent-Type
respons.
Content-Type
:application/octet-stream
untuk bingkai biner;text/plain
untuk bingkai teks;- Header
Content-Type
:application/octet-stream
untuk bingkai biner;text/plain
untuk bingkai teks; - Header
ce-connectionState
: Jika header ini ada, status koneksi dari koneksi ini akan diperbarui ke nilai header. Hanya peristiwa pemblokiran yang dapat memperbarui status koneksi. Sampel di bawah ini menggunakan untaian JSON dikodekan base64 untuk menyimpan status kompleks untuk koneksi.
Saat Content-Type
adalah application/octet-stream
, layanan mengirimkan UserResponsePayload
ke klien menggunakan binary
bingkai WebSocket. Saat Content-Type
adalah text/plain
, layanan mengirimkan UserResponsePayload
ke klien menggunakan text
bingkai WebSocket.
HTTP/1.1 200 OK
Content-Type: application/octet-stream (for binary frame) or text/plain (for text frame)
Content-Length: nnnn
ce-connectionState: eyJrZXkiOiJhIn0=
UserResponsePayload
Format respons kesalahan
Ketika kode status tidak berhasil, kode tersebut dianggap sebagai respons kesalahan. Koneksi akan diputuskan jika message
kode status respons tidak berhasil.
Peristiwa kustom pengguna {custom_event}
untuk klien PubSub WebSocket
Layanan ini memanggil webhook penanganan peristiwa untuk setiap pesan peristiwa kustom yang valid.
Kasus 1: mengirim peristiwa dengan data teks:
{
"type": "event",
"event": "<event_name>",
"dataType" : "text",
"data": "text data"
}
Apa yang diterima oleh penanganan aktivitas upstream seperti di bawah ini, Content-Type
untuk permintaan HTTP CloudEvents adalah text/plain
untuk dataType
=text
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: text/plain
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
ce-subprotocol: json.webpubsub.azure.v1
ce-connectionState: eyJrZXkiOiJhIn0=
text data
Kasus 2: mengirim peristiwa dengan data JSON:
{
"type": "event",
"event": "<event_name>",
"dataType" : "json",
"data": {
"hello": "world"
},
}
Apa yang diterima oleh penanganan aktivitas upstream seperti di bawah ini, Content-Type
untuk permintaan HTTP CloudEvents adalah application/json
untuk dataType
=json
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/json
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
ce-subprotocol: json.webpubsub.azure.v1
ce-connectionState: eyJrZXkiOiJhIn0=
{
"hello": "world"
}
Kasus 3: mengirim peristiwa dengan data biner:
{
"type": "event",
"event": "<event_name>",
"dataType" : "binary",
"data": "aGVsbG8gd29ybGQ=" // base64 encoded binary
}
Apa yang diterima oleh penanganan aktivitas upstream seperti di bawah ini, Content-Type
untuk permintaan HTTP CloudEvents adalah application/octet-stream
untuk dataType
=binary
POST /upstream HTTP/1.1
Host: xxxxxx
WebHook-Request-Origin: xxx.webpubsub.azure.com
Content-Type: application/octet-stream
Content-Length: nnnn
ce-specversion: 1.0
ce-type: azure.webpubsub.user.<event_name>
ce-source: /client/{connectionId}
ce-id: {eventId}
ce-time: 2021-01-01T00:00:00Z
ce-signature: sha256={connection-id-hash-primary},sha256={connection-id-hash-secondary}
ce-userId: {userId}
ce-connectionId: {connectionId}
ce-hub: {hub_name}
ce-eventName: <event_name>
ce-subprotocol: json.webpubsub.azure.v1
<binary data>
Format respons keberhasilan
HTTP/1.1 200 OK
Content-Type: application/octet-stream | text/plain | application/json
Content-Length: nnnn
UserResponsePayload
- Kode status
204
: Sukses, tanpa konten.200
: Keberhasilan, pengiriman data ke klien PubSub WebSocket tergantung padaContent-Type
;
- Header
ce-connectionState
: Jika header ini ada, status koneksi dari koneksi ini akan diperbarui ke nilai header. Hanya peristiwa pemblokiran yang dapat memperbarui status koneksi. Sampel di bawah ini menggunakan string JSON yang dikodekan base64 untuk menyimpan status kompleks untuk koneksi. - Jika Header
Content-Type
adalahapplication/octet-stream
, layanan akan mengirimUserResponsePayload
kembali ke klien menggunakandataType
sebagaibinary
dengan payload base64 dienkode. Contoh respons:{ "type": "message", "from": "server", "dataType": "binary", "data" : "aGVsbG8gd29ybGQ=" }
Content-Type
Ketika adalahtext/plain
, layanan mengirimUserResponsePayload
ke klien menggunakandataType
sebagaitext
dengan string payload.- Saat
Content-Type
adalahapplication/json
, layanan mengirimkanUserResponsePayload
ke klien menggunakandataType
=json
dengan token nilaidata
sebagai badan payload respons.
Format respons kesalahan
Ketika kode status tidak berhasil, kode tersebut dianggap sebagai respons kesalahan. Koneksi akan diputuskan jika {custom_event}
kode status respons tidak berhasil.
Langkah berikutnya
Gunakan sumber daya ini untuk mulai membangun aplikasi Anda sendiri: