सदस्य कनेक्शन समाप्त करना
चैनल ऑथराइज़ेशन सब्सक्रिप्शन को नियंत्रित करता है लेकिन कनेक्शन-स्तरीय पहचान असाइन नहीं करता। उस पहचान के बिना, कहीं और साइन आउट करने से मौजूदा सॉकेट बंद नहीं होता और न ही उसके चैनल सब्सक्रिप्शन हटते हैं।
कनेक्शन को आपके बैकएंड से member_id असाइन करने के लिए signin() कॉल करें। इसके बाद disconnect ऑपरेशन ऐप पर उस सदस्य के सभी कनेक्शन बंद कर सकता है।
रिमोट साइन-आउट, टोकन रद्दीकरण, बैन, पासवर्ड बदलने, या वर्कस्पेस-सीट हटाने के बाद इस फ़्लो का उपयोग करें।
1. कनेक्शन को साइन इन करें
क्लाइंट को अपने बैकएंड के एक एंडपॉइंट पर पॉइंट करें और signin() एक बार कॉल करें:
import { BirdRealtime } from "@messagebird/realtime";
const bird = new BirdRealtime({
appKey: "your-app-key",
region: "us1",
memberAuthEndpoint: "/bird/auth/member",
});
const member = await bird.signin();
console.log("signed in as", member.member_id);import BirdRealtime
let bird = BirdRealtime(options: .init(
appKey: "your-app-key",
region: "us1",
memberAuthEndpoint: URL(string: "https://your-backend.example.com/bird/auth/member")
))
let member = try await bird.signin()
print("signed in as", member.memberId)import com.bird.realtime.BirdRealtime
import com.bird.realtime.BirdRealtimeOptions
val bird = BirdRealtime(
BirdRealtimeOptions(
appKey = "your-app-key",
region = "us1",
memberAuthEndpoint = "https://your-backend.example.com/bird/auth/member",
)
)
val member = bird.signin() // suspending
println("signed in as ${member.memberId}")पहचान कनेक्शन से जुड़ी होती है। signin() एक बार कॉल करें, और क्लाइंट हर रीकनेक्ट के बाद फिर से साइन इन करता है।
साइन इन करने से चैनल सब्सक्रिप्शन ऑथराइज़ नहीं होते। प्राइवेट और प्रेज़ेंस चैनल अभी भी आपके चैनल ऑथराइज़ेशन एंडपॉइंट को कॉल करते हैं। बिना सदस्य पहचान वाला कनेक्शन किसी भी ऐसे चैनल को सब्सक्राइब कर सकता है जिसे वह एंडपॉइंट स्वीकार करे। देखें चैनल ऑथराइज़ करना।
2. अपने बैकएंड से पहचान साइन करें
क्लाइंट कनेक्शन ID को एक POST रिक्वेस्ट में भेजता है:
कोड उदाहरण
{ "connection_id": "26896.319537" }आपका एंडपॉइंट पहचान को एक JSON स्ट्रिंग के रूप में लौटाता है, साथ ही उसी स्ट्रिंग पर एक सिग्नेचर:
कोड उदाहरण
{
"auth": "your-app-key:8f9a…",
"member_data": "{\"member_id\":\"u_42\",\"member_info\":{\"name\":\"Ada\"}}"
}साइन करने वाली स्ट्रिंग <connection_id>::member::<member_data> है, जिसमें member के दोनों तरफ़ दो कोलन हैं। इसे ऐप सीक्रेट के साथ HMAC-SHA256 करें, hex-encode करें, और ऐप key को प्रीफ़िक्स करें:
import { createHmac } from "node:crypto";
app.post("/bird/auth/member", (req, res) => {
const { connection_id } = req.body;
// Your own decision: who is this caller, and may they connect at all?
const user = getUserFromSession(req);
if (!user) return res.sendStatus(403);
const memberData = JSON.stringify({
member_id: user.id,
member_info: { name: user.name },
});
const sig = createHmac("sha256", process.env.BIRD_REALTIME_SECRET)
.update(`${connection_id}::member::${memberData}`)
.digest("hex");
res.json({ auth: `${process.env.BIRD_REALTIME_KEY}:${sig}`, member_data: memberData });
});import hmac, hashlib, json, os
def sign_in(connection_id: str, user) -> dict:
key = os.environ["BIRD_REALTIME_KEY"]
secret = os.environ["BIRD_REALTIME_SECRET"].encode()
member_data = json.dumps({"member_id": user.id, "member_info": {"name": user.name}})
to_sign = f"{connection_id}::member::{member_data}"
sig = hmac.new(secret, to_sign.encode(), hashlib.sha256).hexdigest()
return {"auth": f"{key}:{sig}", "member_data": member_data}func signIn(connectionID string, user User) (map[string]string, error) {
key := os.Getenv("BIRD_REALTIME_KEY")
secret := []byte(os.Getenv("BIRD_REALTIME_SECRET"))
memberData, err := json.Marshal(map[string]any{
"member_id": user.ID,
"member_info": map[string]string{"name": user.Name},
})
if err != nil {
return nil, err
}
mac := hmac.New(sha256.New, secret)
mac.Write([]byte(connectionID + "::member::" + string(memberData)))
return map[string]string{
"auth": key + ":" + hex.EncodeToString(mac.Sum(nil)),
"member_data": string(memberData),
}, nil
}function signIn(string $connectionId, User $user): array
{
$key = getenv('BIRD_REALTIME_KEY');
$secret = getenv('BIRD_REALTIME_SECRET');
$memberData = json_encode(['member_id' => $user->id, 'member_info' => ['name' => $user->name]]);
$sig = hash_hmac('sha256', "{$connectionId}::member::{$memberData}", $secret);
return ['auth' => "{$key}:{$sig}", 'member_data' => $memberData];
}जो member_data स्ट्रिंग आप लौटाते हैं, ठीक उसी पर साइन करें। ऑब्जेक्ट को दोबारा serialize करने से उसके बाइट्स बदल सकते हैं और सिग्नेचर अमान्य हो सकता है।
member_id वह मान है जिसे disconnect ऑपरेशन लक्षित करता है। यह + : @ . _ - सहित 128 तक URL-safe कैरेक्टर स्वीकार करता है, लेकिन / ? # % या व्हाइटस्पेस नहीं। अगर आपके आइडेंटिफ़ायर में असमर्थित कैरेक्टर हैं, तो साइन करने से पहले उसे एक स्थिर safe मान में मैप करें। एज अमान्य member ID को अस्वीकार कर देता है, जिससे कनेक्शन बिना किसी ऐसी पहचान के रह जाता है जिसे disconnect ऑपरेशन लक्षित कर सके।
member_info वैकल्पिक है। कनेक्शन साइन-इन के लिए, यह प्रेज़ेंस चैनल पर ब्रॉडकास्ट होने के बजाय उस क्लाइंट को लौटाया जाता है।
पहचान में member ids की एक watchlist ऐरे भी हो सकती है। watchlist_events सक्षम ऐप्स पर, कनेक्शन को तब सूचित किया जाता है जब वे सदस्य ऑनलाइन या ऑफ़लाइन होते हैं; देखें Watchlist इवेंट्स।
यहाँ साइन की गई स्ट्रिंग जानबूझकर उस स्ट्रिंग से अलग है जो प्रेज़ेंस सब्सक्रिप्शन साइन करता है, ताकि प्रेज़ेंस ऑथराइज़ेशन को कभी भी पहचान दावा करने के लिए रीप्ले न किया जा सके, भले ही दोनों पेलोड member_data कहलाते हों।
3. सदस्य को डिस्कनेक्ट करें
await bird.realtime.members.disconnect("rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42");client.realtime.members.disconnect("rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42")if err := client.Realtime.Members.Disconnect(context.Background(), "rap_01krdgeqcxet5s7t44vh8rt9mg", "u_42"); err != nil {
log.Fatal(err)
}$bird->realtime->members->disconnect('rap_01krdgeqcxet5s7t44vh8rt9mg', 'u_42');curl -X POST \
https://us1.platform.bird.com/v1/realtime/apps/rap_01krdgeqcxet5s7t44vh8rt9mg/members/u_42/disconnect \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "X-Realtime-Key: $BIRD_REALTIME_KEY" \
-H "X-Realtime-Secret: $BIRD_REALTIME_SECRET"यह ऑपरेशन ऐप पर उस सदस्य के सभी साइन-इन कनेक्शन बंद करता है, जिसमें अन्य टैब और डिवाइस शामिल हैं। यह अनाम कनेक्शन या किसी अन्य सदस्य को असाइन किए गए कनेक्शन बंद नहीं करता।
क्लाइंट को क्या दिखता है
कनेक्शन कोड 4009 के साथ बंद होता है और स्वचालित रूप से रीकनेक्ट नहीं होता:
bird.connection.bind("error", (e) => {
if (e.code === 4009) showSignedOutScreen();
});bird.onError { error in
if error.code == 4009 { showSignedOutScreen() }
}bird.onError { error ->
if (error.code == 4009) showSignedOutScreen()
}जब ऑथेंटिकेशन समाप्त हो जाए तो साइन-आउट स्थिति दिखाएँ। bird.connect() कॉल करने से एक नया कनेक्शन शुरू होता है जो आपके एंडपॉइंट से साइन इन करता है, इसलिए सदस्य की ऑथराइज़ेशन स्थिति बदलने के बाद ही रीकनेक्ट करें।
साइन-इन विफलता सॉकेट बंद नहीं करती। क्लाइंट विफलता को अलग से रिपोर्ट करता है और कनेक्शन को बिना सदस्य पहचान के छोड़ देता है। रीकनेक्ट के बाद, क्लाइंट इसे signin_error के ज़रिए रिपोर्ट करता है क्योंकि मूल signin() promise पहले ही resolve हो चुका होता है।
bird.connection.bind("signin_error", (e) => {
console.warn("connection has no identity:", e.message);
});bird.onSigninError { error in
print("connection has no identity:", error.message)
}bird.onSigninError { error ->
println("connection has no identity: ${error.message}")
}कनेक्शन अभी भी ऑथराइज़्ड चैनलों से इवेंट प्राप्त कर सकता है, लेकिन member-event और disconnect ऑपरेशन इसे लक्षित नहीं कर सकते। ब्राउज़र क्लाइंट में, इस स्थिति में bird.signedInMember का मान null होता है।
रीकनेक्शन रोकें
Disconnect ऑपरेशन मौजूदा कनेक्शन बंद करता है बिना कोई स्थायी ब्लॉक बनाए। वही क्लाइंट फिर से कनेक्ट कर सकता है।
सदस्य को डिस्कनेक्ट करने से पहले सेशन रद्द करें या बैन रिकॉर्ड करें। इसके बाद अगर क्लाइंट रीकनेक्ट करता है तो आपका सदस्य ऑथराइज़ेशन एंडपॉइंट 403 Forbidden लौटा सकता है।
अगले कदम
- चैनल ऑथराइज़ करना आपके बैकएंड द्वारा प्राइवेट और प्रेज़ेंस सब्सक्रिप्शन के लिए कंप्यूट किए जाने वाले दूसरे सिग्नेचर को कवर करता है।
- सदस्य को डिस्कनेक्ट करें इस रिक्वेस्ट का पूरा API रेफ़रेंस है।
- सदस्य को इवेंट भेजना दूसरा member-addressed ऑपरेशन है।
- प्रेज़ेंस चैनल बताते हैं कि एक सदस्य के पास कई कनेक्शन क्यों हो सकते हैं।
संबंधित संसाधन
इस विषय के लिए डॉक्यूमेंटेशन, गाइड और उदाहरणों के साथ आगे बढ़ें। संसाधन अंग्रेज़ी में हैं।
क्षमता जानेंRealtimeलर्निंग पाथ फ़ॉलो करेंBuild your first integrationइम्प्लीमेंटेशन गाइडSend your first realtime event
अभ्यास करें और इम्प्लीमेंटेशन ब्रीफ़ पाएँ