Kendalikan siapa yang terhubung dan berlangganan dengan aturan sesi yang sudah Anda miliki.
Kirim pembaruan pesanan privat, peringatan akun, dan event workspace ke klien browser dan seluler tanpa mengekspos kredensial backend di kode klien. Endpoint autentikasi Anda sendiri memeriksa sesi pemanggil dan menandatangani langganan channel privat atau presence per koneksi, sementara enkripsi end-to-end menyegel payload sensitif sebelum keluar dari server Anda.
auth.ts
200 · ditandatangani403 · Forbidden200 · ditandatangani200 · ditandatangani// 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 }, }), }), );});
POST/bird/auth
Isi respons
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · ditandatangani403 · Forbidden200 · ditandatangani200 · ditandatangani// 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 }, }), }), );});
POST/bird/auth
Isi respons
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · ditandatangani403 · Forbidden200 · ditandatangani200 · ditandatangani// 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 }, }), }), );});
POST/bird/auth
Isi respons
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
Berikan kunci publik ke klien
sambil menyimpan rahasia penandatanganan di server Anda.
Aplikasi di Bird Realtime API memisahkan kredensial koneksi klien dari otoritas backend. Browser dan aplikasi seluler membuka WebSocket dengan kunci aplikasi publik yang aman disematkan dalam bundle klien, sementara backend Anda menyimpan rahasia untuk memublikasikan event dan menandatangani token langganan. Saat kebijakan keamanan Anda mewajibkan rotasi kredensial, Anda dapat membuat pasangan kunci kedua, menerapkannya di seluruh layanan Anda, lalu mencabut pasangan sebelumnya tanpa memutus pengguna aktif.
Lindungi koneksi, channel, dan payload di setiap lapisan
Verifikasi siapa yang dapat membuka socket, otorisasi channel yang mereka ikuti, enkripsi data event yang sensitif, dan putus akses saat sesi berakhir.
- 01
Langganan channel bertanda tangan.
Saat klien browser atau seluler berlangganan channel privat atau presence, backend Anda memeriksa sesi pengguna dan menandatangani token HMAC-SHA256 yang terikat pada ID koneksi dan nama channel tersebut. Karena tanda tangan terikat pada ID socket, token tidak dapat diputar ulang di koneksi lain, dan tanda tangan presence juga mengunci identitas anggota yang ditampilkan di room.
- 02
Koneksi WebSocket terautentikasi.
Karena kunci aplikasi publik Anda ada di kode klien, setiap pengunjung bisa mencoba membuka WebSocket yang menganggur. Dengan koneksi terotorisasi diaktifkan, socket baru harus diautentikasi melalui backend Anda dalam 30 detik, baik dengan masuk maupun dengan berlangganan channel privat. Socket yang tidak terverifikasi ditutup otomatis dan tidak dihitung dalam kuota koneksi Anda.
- 03
Payload terenkripsi end-to-end.
Untuk pembaruan yang diatur regulasi atau rahasia, SDK server mengenkripsi payload event secara lokal dengan kunci master 32 byte yang tetap berada di infrastruktur Anda. Setiap channel terenkripsi menurunkan kunci dekripsinya sendiri, sehingga menyetujui klien untuk satu stream rahasia tidak memberinya akses ke stream lain, dan server perantara hanya melihat ciphertext selama transit.
- 04
Pencabutan sesi seketika.
Saat pengguna keluar, mengganti kata sandi, atau kehilangan akses workspace, satu panggilan server memutus identitas anggotanya di semua tab browser dan perangkat seluler yang terbuka. Klien menganggap pemutusan itu final alih-alih terus menyambung ulang, dan endpoint autentikasi Anda dapat menolak upaya masuk berikutnya setelah sesi dicabut.
Channel terenkripsi
Segel payload sensitif sebelum keluar dari server Anda.
Konfigurasikan kunci master 32 byte di SDK server untuk mengenkripsi event rahasia di dalam proses Anda sendiri sebelum dipublikasikan. Bird meneruskan amplop tersegel ke pelanggan, dan endpoint otorisasi Anda mengirimkan kunci dekripsi turunan channel ke klien browser yang disetujui. Anda juga dapat menggabungkan enkripsi dengan caching event terakhir agar klien yang baru terhubung menerima status terbaru sebagai ciphertext. Tetap gunakan nama channel dan event yang generik, karena metadata perutean tidak dienkripsi.
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" },
});
Isolasi stream tenant dan validasi status di server Anda.
Autentikasi koneksi dan otorisasi channel menangani bagian kontrol akses yang berbeda. Mewajibkan koneksi terotorisasi memblokir socket anonim, sementara channel privat dan presence membatasi pengguna atau tenant mana yang dapat membaca stream tertentu. Simpan pembaruan khusus pelanggan di channel privat yang diverifikasi endpoint autentikasi Anda, gunakan event antarklien untuk sinyal UI sementara seperti indikator mengetik, dan arahkan tindakan yang mengubah status melalui backend Anda.
Kunci trafik ke satu region dan isolasi lingkungan per aplikasi.
Pilih region khusus saat membuat aplikasi Realtime agar koneksi WebSocket dan event yang dipublikasikan tetap dekat dengan pengguna Anda, meskipun region utama workspace Anda berada di tempat lain. Karena setiap aplikasi berjalan di namespace terisolasi dengan kredensial dan kuota terpisah, aplikasi terpisah untuk pengembangan, staging, dan produksi mencegah siaran uji masuk ke channel pelanggan yang aktif.
Panduan implementasi untuk backend Anda.
Ikuti otorisasi channel untuk format permintaan webhook dan helper penandatanganan SDK. Baca mewajibkan koneksi terotorisasi untuk menerapkan handshake koneksi 30 detik, channel terenkripsi untuk mengonfigurasi kunci master dan rotasi kunci, serta memutus koneksi anggota untuk menghubungkan proses masuk pengguna dan pemutusan jarak jauh.
Terus membangun
dengan Realtime.
Gabungkan otorisasi channel dengan presence langsung, caching status, dan webhook backend menggunakan kredensial aplikasi yang sama.
Channel
Arahkan siaran publik, stream privat, payload terenkripsi, dan status cache berdasarkan prefiks channel.
→Presence
Tampilkan siapa yang online di berbagai tab dan perangkat, lacak yang keluar, dan kirim pesan langsung ke pengguna tertentu.
→Webhooks
Picu alur kerja backend saat channel menjadi aktif, anggota keluar, atau cache perlu dipanaskan.
→Skalakan tanpa
kehilangan kendali.
Atur tim dalam workspace, kontrol akses API, dan lacak perubahan melalui log audit.
Organisasi
Harbor
Akses tetap dalam workspace-nya.
Produksi/Kunci API
Backend pelabuhan
AktifAlex Lee
Admin
Hari ini · UTC
Log audit
Organisasi
Harbor
Akses tetap dalam workspace-nya.
Produksi/Kunci API
Backend pelabuhan
AktifAlex Lee
Admin
Hari ini · UTC
Log audit
Organisasi
Harbor
Akses tetap dalam workspace-nya.
Produksi/Kunci API
Backend pelabuhan
AktifAlex Lee
Admin
Hari ini · UTC
Log audit