Keamanan realtime
Aturan sesi Anda yang menentukan siapa yang boleh berlangganan.
Tidak ada model izin yang perlu dikonfigurasi di Bird. Langganan private atau presence disetujui oleh endpoint yang Anda tulis, menggunakan sesi yang sudah Anda miliki, dan ditandatangani dengan secret yang hanya dipegang server Anda. Bird memverifikasi tanda tangan; Anda yang menentukan kebijakannya.
// Your endpoint. The only place the app secret lives.
app.post("/bird/auth", async (req, res) => {
const { connection_id, channel_name } = req.body;
const user = await session(req);
if (!mayJoin(user, channel_name)) return res.sendStatus(403);
// Signs <connection_id>:<channel_name>[:<member_data>] with the app
// secret, and adds shared_secret on an encrypted channel.
res.json(
await bird.realtime.authorizeChannel({
connectionId: connection_id,
channelName: channel_name,
memberData: JSON.stringify({
member_id: user.id,
member_info: { name: user.name },
}),
}),
);
});
Satu kunci bersifat publik. Satu lagi tidak.
Semuanya bermula dari pemisahan itu.
Setiap aplikasi di Bird Realtime API memiliki key dan secret. Key dimaksudkan untuk disertakan dalam kode klien; secret mengautentikasi panggilan server Anda dan menandatangani langganan, dan hanya ditampilkan sekali, saat pembuatan. Siapa pun yang memilikinya dapat mempublikasikan ke aplikasi Anda dan memalsukan identitas presence, jadi perlakukan seperti kata sandi database. Rotasi bersifat aditif, bukan disruptif: buat key kedua, deploy, lalu cabut yang lama.
Empat kontrol, empat pertanyaan
Siapa yang boleh berlangganan, siapa yang boleh mempertahankan koneksi, siapa yang bisa membaca payload, dan siapa yang masih diizinkan masuk.
- 01
Langganan bertanda tangan.
Klien mengirimkan connection id dan nama kanal ke endpoint Anda. Anda memeriksa pemanggil, menolak dengan 403 jika mereka tidak boleh bergabung, atau mengembalikan tanda tangan HMAC-SHA256 atas connection id dan nama kanal, diawali dengan app key. Karena connection id ada di dalam tanda tangan, persetujuan hanya mencakup satu koneksi dan tidak bisa diulang ke koneksi lain. Kanal presence juga menandatangani identitas member, dan harus berupa string yang persis seperti yang Anda kembalikan: serialisasi ulang objek yang sama dapat mengubah urutan key dan membatalkan tanda tangan.
- 02
Koneksi terotorisasi.
App key bersifat publik, jadi siapa pun yang bisa memuat halaman Anda dapat membuka socket dengannya. Aktifkan koneksi terotorisasi dan setiap koneksi baru memiliki 30 detik untuk membuktikan bahwa sesuatu yang memegang secret menjaminnya, melalui langganan private atau sign-in. Koneksi yang tidak terverifikasi ditutup dengan kode 4009, dan koneksi tidak terotorisasi tidak pernah dihitung terhadap kuota Anda. Berlangganan kanal publik tidak membuktikan apa pun dan tidak mengotorisasi koneksi.
- 03
Enkripsi end-to-end.
Kanal private-encrypted- disegel oleh server Anda sebelum permintaan meninggalkan proses Anda, dengan master key 32-byte yang tidak pernah muncul dalam permintaan Realtime API. Setiap kanal menurunkan key-nya sendiri, sehingga mengotorisasi klien untuk satu kanal terenkripsi tidak memungkinkannya membaca kanal lain. Bird tidak dapat memulihkan key yang hilang, dan rotasi melindungi payload masa depan, bukan yang lalu.
- 04
Mencabut akses sekarang.
Pengguna yang sign-out, kata sandi yang diubah, akun yang diblokir: putuskan koneksi member dan setiap koneksi yang dimiliki identitas tersebut tertutup, di setiap perangkat. Klien memperlakukan penutupan itu sebagai final dan tidak mencoba ulang, dan endpoint Anda berhenti menandatangani untuk mereka, sehingga mereka tidak bisa kembali.
Kanal terenkripsi
Payload yang tidak bisa dibaca Bird, di infrastruktur yang dijalankan Bird.
SDK server mendeteksi prefix kanal, menurunkan key kanal tersebut dari master key Anda, dan menyegel payload secara lokal. Edge meneruskan ciphertext dan endpoint otorisasi Anda memberikan derived key hanya kepada klien yang disetujui. Dua batasan yang perlu dipertimbangkan dalam desain: nama kanal dan event dikirim dalam bentuk teks biasa, jadi pilih nama yang tidak membocorkan apa yang Anda lindungi, dan enkripsi tidak bisa dikombinasikan dengan presence atau client events. Caching tetap bisa: kanal private-encrypted-cache- menyimpan cached event dalam keadaan tersegel.
const bird = new BirdClient({
apiKey: process.env.BIRD_API_KEY!,
realtime: {
key: process.env.BIRD_REALTIME_KEY,
secret: process.env.BIRD_REALTIME_SECRET,
// 32 random bytes, yours alone. Never sent to Bird.
encryptionMasterKey: process.env.BIRD_REALTIME_MASTER_KEY,
},
});
// Sealed in your process. The edge forwards ciphertext.
await bird.realtime.publish(APP_ID, {
event: "order.updated",
channels: ["private-encrypted-orders"],
data: { order_id: "ord_123", status: "shipped" },
});
Apa yang tidak dilakukan otorisasi.
Mewajibkan koneksi terotorisasi mengontrol siapa yang boleh mempertahankan socket terbuka. Ini tidak mengubah siapa yang bisa membaca kanal: kanal publik tetap bisa dibaca oleh setiap koneksi terotorisasi, jadi event yang dimiliki satu pelanggan harus ditempatkan di kanal private yang namanya diperiksa oleh endpoint Anda. Dan karena endpoint Anda adalah otoritasnya, endpoint yang permisif memberikan akses sebebas key yang bocor. Hal yang sama berlaku untuk client events, yang tidak divalidasi oleh edge: gunakan untuk sinyal, dan rutekan apa pun yang bersifat otoritatif melalui server Anda.
Di mana data berada.
Aplikasi memilih regionnya saat Anda membuatnya dan mempertahankannya seumur hidup, jadi pilih yang terdekat dengan pengguna Anda, dan region aplikasi bisa berbeda dari region utama workspace Anda. Aplikasi juga merupakan batas isolasi: dua aplikasi tidak pernah melihat kanal satu sama lain, itulah mengapa satu aplikasi per environment adalah cara yang tepat untuk menjaga traffic staging tidak masuk ke production.
Pelajari lebih dalam di dokumentasi.
Mengotorisasi kanal memiliki kontrak request dan response serta string yang tepat untuk ditandatangani. Mewajibkan koneksi terotorisasi mencakup jendela 30 detik dan kode 4009, kanal terenkripsi mencakup pembuatan dan rotasi key, dan mengakhiri koneksi member adalah alur sign-in dan disconnect.
Terapkan dalam praktik.
Lanjutkan dengan dokumentasi, panduan, dan contoh untuk topik ini. Sumber daya tersedia dalam bahasa Inggris.
Fitur Realtime lainnya
Satu aplikasi, satu pasangan key. Jelajahi kemampuan lainnya.
Kirim key-nya. Rahasiakan secret-nya.
Langganan bertanda tangan, koneksi terotorisasi, dan channel terenkripsi menjadi bagian dari setiap aplikasi Realtime, di setiap paket.