तय करें कि कौन कनेक्ट और सब्सक्राइब करे अपने मौजूदा सेशन नियमों के साथ।
क्लाइंट कोड में बैकएंड क्रेडेंशियल उजागर किए बिना ब्राउज़र और मोबाइल क्लाइंट तक निजी ऑर्डर अपडेट, खाता अलर्ट और वर्कस्पेस इवेंट पहुँचाएँ। आपका अपना ऑथ एंडपॉइंट कॉल करने वाले का सेशन जाँचता है और हर कनेक्शन के लिए निजी या प्रेज़ेंस चैनल सब्सक्रिप्शन पर हस्ताक्षर करता है, जबकि एंड-टू-एंड एन्क्रिप्शन संवेदनशील पेलोड को आपके सर्वर से निकलने से पहले ही सील कर देता है।
auth.ts
200 · हस्ताक्षरित403 · निषिद्ध200 · हस्ताक्षरित200 · हस्ताक्षरित// 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
प्रतिक्रिया बॉडी
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · हस्ताक्षरित403 · निषिद्ध200 · हस्ताक्षरित200 · हस्ताक्षरित// 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
प्रतिक्रिया बॉडी
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
auth.ts
200 · हस्ताक्षरित403 · निषिद्ध200 · हस्ताक्षरित200 · हस्ताक्षरित// 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
प्रतिक्रिया बॉडी
{ "auth": "d0e95a856ddc1b09d4c8:8f9a2c71e4…", "member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Maya Chen\"}}" }
क्लाइंट को सार्वजनिक कुंजी दें
और हस्ताक्षर करने वाले सीक्रेट अपने सर्वर पर ही रखें।
Bird Realtime API पर बना ऐप क्लाइंट कनेक्शन क्रेडेंशियल को बैकएंड अधिकार से अलग रखता है। ब्राउज़र और मोबाइल ऐप एक सार्वजनिक ऐप कुंजी से WebSocket खोलते हैं, जिसे क्लाइंट बंडल में रखना सुरक्षित है, जबकि आपका बैकएंड वह सीक्रेट रखता है जिससे इवेंट प्रकाशित होते हैं और सब्सक्रिप्शन टोकन पर हस्ताक्षर होते हैं। जब आपकी सुरक्षा नीति क्रेडेंशियल बदलने की माँग करे, तो आप दूसरी कुंजी जोड़ी बना सकते हैं, उसे अपनी सेवाओं में लागू कर सकते हैं और सक्रिय उपयोगकर्ताओं को डिस्कनेक्ट किए बिना पिछली जोड़ी रद्द कर सकते हैं।
हर स्तर पर कनेक्शन, चैनल और पेलोड सुरक्षित रखें
सत्यापित करें कि सॉकेट कौन खोल सकता है, अधिकृत करें कि वे किन चैनलों से जुड़ें, संवेदनशील इवेंट डेटा एन्क्रिप्ट करें, और सेशन खत्म होते ही पहुँच बंद करें।
- 01
हस्ताक्षरित चैनल सब्सक्रिप्शन।
जब कोई ब्राउज़र या मोबाइल क्लाइंट किसी निजी या प्रेज़ेंस चैनल को सब्सक्राइब करता है, तो आपका बैकएंड उपयोगकर्ता का सेशन जाँचता है और उसी कनेक्शन ID और चैनल नाम से बँधे HMAC-SHA256 टोकन पर हस्ताक्षर करता है। हस्ताक्षर को सॉकेट ID से बाँधने से टोकन को किसी दूसरे कनेक्शन पर दोबारा इस्तेमाल नहीं किया जा सकता, और प्रेज़ेंस हस्ताक्षर रूम में दिखने वाली सदस्य पहचान को भी तय कर देते हैं।
- 02
प्रमाणित WebSocket कनेक्शन।
आपकी सार्वजनिक ऐप कुंजी क्लाइंट कोड में होती है, इसलिए कोई भी विज़िटर निष्क्रिय WebSocket खोलने की कोशिश कर सकता है। अधिकृत कनेक्शन चालू करने पर हर नए सॉकेट को 30 सेकंड के भीतर आपके बैकएंड से प्रमाणित होना पड़ता है, या तो साइन इन करके या किसी निजी चैनल को सब्सक्राइब करके। असत्यापित सॉकेट अपने-आप बंद हो जाते हैं और आपके कनेक्शन कोटा में नहीं गिने जाते।
- 03
एंड-टू-एंड एन्क्रिप्टेड पेलोड।
विनियमित या गोपनीय अपडेट के लिए, सर्वर SDK इवेंट पेलोड को स्थानीय रूप से 32-बाइट मास्टर कुंजी से एन्क्रिप्ट करता है, जो आपके इंफ्रास्ट्रक्चर पर ही रहती है। हर एन्क्रिप्टेड चैनल अपनी अलग डिक्रिप्शन कुंजी बनाता है, इसलिए किसी क्लाइंट को एक गोपनीय स्ट्रीम की अनुमति देने से उसे दूसरी स्ट्रीम तक पहुँच नहीं मिलती, और बीच के सर्वर ट्रांज़िट में केवल सिफरटेक्स्ट देखते हैं।
- 04
सेशन का तुरंत निरस्तीकरण।
जब कोई उपयोगकर्ता लॉग आउट करता है, पासवर्ड बदलता है या वर्कस्पेस की पहुँच खो देता है, तो एक ही सर्वर कॉल खुले ब्राउज़र टैब और मोबाइल डिवाइस पर उसकी सदस्य पहचान को डिस्कनेक्ट कर देती है। क्लाइंट इस समाप्ति को अंतिम मानते हैं और बार-बार दोबारा कनेक्ट नहीं करते, और सेशन निरस्त होने के बाद आपका ऑथ एंडपॉइंट आगे के साइन-इन प्रयास अस्वीकार कर सकता है।
एन्क्रिप्टेड चैनल
संवेदनशील पेलोड को अपने सर्वर से निकलने से पहले सील करें।
प्रकाशित करने से पहले गोपनीय इवेंट को अपनी ही प्रोसेस में एन्क्रिप्ट करने के लिए सर्वर SDK में 32-बाइट मास्टर कुंजी कॉन्फ़िगर करें। Bird सील किया गया संदेश सब्सक्राइबर तक पहुँचाता है, और आपका ऑथराइज़ेशन एंडपॉइंट चैनल की व्युत्पन्न डिक्रिप्शन कुंजी स्वीकृत ब्राउज़र क्लाइंट को देता है। आप एन्क्रिप्शन को अंतिम-इवेंट कैशिंग के साथ भी जोड़ सकते हैं, ताकि नए कनेक्ट हुए क्लाइंट को नवीनतम स्थिति सिफरटेक्स्ट के रूप में मिले; चैनल और इवेंट के नाम सामान्य रखें, क्योंकि रूटिंग मेटाडेटा एन्क्रिप्ट नहीं होता।
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" },
});
टेनेंट स्ट्रीम अलग रखें और स्थिति को अपने सर्वर पर सत्यापित करें।
कनेक्शन प्रमाणीकरण और चैनल ऑथराइज़ेशन पहुँच नियंत्रण के अलग-अलग हिस्से संभालते हैं। अधिकृत कनेक्शन अनिवार्य करने से गुमनाम सॉकेट रुकते हैं, जबकि निजी और प्रेज़ेंस चैनल तय करते हैं कि कौन-सा साइन-इन उपयोगकर्ता या टेनेंट कोई खास स्ट्रीम पढ़ सकता है। ग्राहक-विशिष्ट अपडेट को अपने ऑथ एंडपॉइंट से सत्यापित निजी चैनलों पर रखें, टाइपिंग संकेतक जैसे अस्थायी UI संकेतों के लिए क्लाइंट-से-क्लाइंट इवेंट इस्तेमाल करें, और स्थिति बदलने वाली कार्रवाइयाँ अपने बैकएंड से भेजें।
ट्रैफ़िक को एक क्षेत्र में रखें और ऐप के आधार पर परिवेश अलग करें।
Realtime ऐप बनाते समय एक समर्पित क्षेत्र चुनें, ताकि WebSocket कनेक्शन और प्रकाशित इवेंट आपके उपयोगकर्ताओं के पास रहें, भले ही आपके वर्कस्पेस का मूल क्षेत्र कहीं और हो। हर ऐप अलग क्रेडेंशियल और कोटा के साथ अपने अलग नेमस्पेस में चलता है, इसलिए डेवलपमेंट, स्टेजिंग और प्रोडक्शन के लिए अलग ऐप बनाने से टेस्ट ब्रॉडकास्ट लाइव ग्राहक चैनलों तक नहीं पहुँचते।
आपके बैकएंड के लिए कार्यान्वयन गाइड।
वेबहुक अनुरोध फ़ॉर्मेट और SDK हस्ताक्षर हेल्पर के लिए चैनल अधिकृत करना देखें। 30 सेकंड का कनेक्शन हैंडशेक लागू करने के लिए अधिकृत कनेक्शन अनिवार्य करना, मास्टर कुंजी और कुंजी रोटेशन कॉन्फ़िगर करने के लिए एन्क्रिप्टेड चैनल, और उपयोगकर्ता साइन-इन व रिमोट डिस्कनेक्ट जोड़ने के लिए सदस्य कनेक्शन समाप्त करना पढ़ें।
Realtime के साथ
बनाते रहें।
उन्हीं ऐप क्रेडेंशियल से चैनल ऑथराइज़ेशन को लाइव प्रेज़ेंस, स्थिति कैशिंग और बैकएंड वेबहुक के साथ जोड़ें।
चैनल
सार्वजनिक ब्रॉडकास्ट, निजी स्ट्रीम, एन्क्रिप्टेड पेलोड और कैश की गई स्थिति को चैनल प्रीफ़िक्स के आधार पर रूट करें।
→प्रेज़ेंस
दिखाएँ कि टैब और डिवाइस पर कौन ऑनलाइन है, जाने वालों को ट्रैक करें, और अलग-अलग उपयोगकर्ताओं को सीधे संदेश भेजें।
→Webhooks
चैनल सक्रिय होने, सदस्यों के जाने या कैश को तैयार करने की ज़रूरत होने पर बैकएंड वर्कफ़्लो चलाएँ।
→बिना नियंत्रण खोए
स्केल करें।
टीमों को वर्कस्पेस में व्यवस्थित करें, API एक्सेस नियंत्रित करें, और ऑडिट लॉग से बदलावों को ट्रेस करें।
संगठन
Harbor
पहुँच अपने वर्कस्पेस तक सीमित रहती है।
प्रोडक्शन/API कुंजियाँ
हार्बर बैकएंड
सक्रियAlex Lee
एडमिन
आज · UTC
ऑडिट लॉग
संगठन
Harbor
पहुँच अपने वर्कस्पेस तक सीमित रहती है।
प्रोडक्शन/API कुंजियाँ
हार्बर बैकएंड
सक्रियAlex Lee
एडमिन
आज · UTC
ऑडिट लॉग
संगठन
Harbor
पहुँच अपने वर्कस्पेस तक सीमित रहती है।
प्रोडक्शन/API कुंजियाँ
हार्बर बैकएंड
सक्रियAlex Lee
एडमिन
आज · UTC
ऑडिट लॉग