सदस्य कनेक्शन बंद करना
चैनल ऑथराइज़ेशन सब्सक्रिप्शन को नियंत्रित करता है, लेकिन कनेक्शन-स्तर की पहचान नहीं देता। इस पहचान के बिना, कहीं और साइन आउट करने से मौजूदा सॉकेट बंद नहीं होता और उसके चैनल सब्सक्रिप्शन नहीं हटते।
अपने बैकएंड से कनेक्शन को member_id देने के लिए signin() कॉल करें। इसके बाद डिस्कनेक्ट ऑपरेशन ऐप पर उस सदस्य के सभी कनेक्शन बंद कर सकता है।
रिमोट साइन-आउट, टोकन रद्द करने, प्रतिबंध, पासवर्ड बदलने या वर्कस्पेस सीट हटाने के बाद इस प्रक्रिया का उपयोग करें।
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 करें और आगे ऐप कुंजी जोड़ें:
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 करने से उसके bytes बदल सकते हैं और सिग्नेचर अमान्य हो सकता है।
member_id वह मान है जिसे डिस्कनेक्ट ऑपरेशन लक्षित करता है। इसमें अधिकतम 128 URL-safe वर्ण हो सकते हैं, जिनमें + : @ . _ - शामिल है, लेकिन / ? # % या whitespace नहीं। अगर आपके identifier में असमर्थित वर्ण हैं, तो साइन करने से पहले उसे किसी स्थिर और सुरक्षित मान से मैप करें। Edge अमान्य member ID को अस्वीकार कर देता है, और तब कनेक्शन के पास ऐसी कोई पहचान नहीं रहती जिसे डिस्कनेक्ट ऑपरेशन लक्षित कर सके।
member_info वैकल्पिक है। कनेक्शन साइन-इन में यह presence चैनल पर broadcast होने के बजाय उसी क्लाइंट को लौटाया जाता है।
पहचान में member ids की एक watchlist array भी हो सकती है। जिन ऐप्स पर watchlist_events सक्षम है, उन पर कनेक्शन को तब सूचना मिलती है जब वे सदस्य ऑनलाइन या ऑफ़लाइन होते हैं; देखें Watchlist इवेंट।
यहाँ साइन की जाने वाली स्ट्रिंग जानबूझकर presence सब्सक्रिप्शन द्वारा साइन की जाने वाली स्ट्रिंग से अलग रखी गई है। इसलिए presence ऑथराइज़ेशन को पहचान का दावा करने के लिए कभी दोबारा इस्तेमाल नहीं किया जा सकता, भले ही दोनों पेलोड का नाम 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"यह ऑपरेशन ऐप पर उस सदस्य के सभी साइन-इन किए हुए कनेक्शन बंद कर देता है, जिनमें दूसरे टैब और डिवाइस भी शामिल हैं। यह anonymous कनेक्शन या किसी दूसरे सदस्य को असाइन किए गए कनेक्शन बंद नहीं करता।
क्लाइंट को क्या दिखता है
कनेक्शन कोड 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() प्रॉमिस पहले ही रिज़ॉल्व हो चुका होता है।
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}")
}कनेक्शन अब भी अधिकृत चैनलों से इवेंट प्राप्त कर सकता है, लेकिन सदस्य-इवेंट और डिस्कनेक्ट ऑपरेशन उसे लक्षित नहीं कर सकते। ब्राउज़र क्लाइंट में इस स्थिति में bird.signedInMember का मान null होता है।
दोबारा कनेक्ट होने से रोकें
डिस्कनेक्ट ऑपरेशन मौजूदा कनेक्शन बंद करता है, पर कोई स्थायी रोक नहीं लगाता। वही क्लाइंट फिर से कनेक्ट हो सकता है।
सदस्य को डिस्कनेक्ट करने से पहले सेशन रद्द करें या प्रतिबंध दर्ज करें। इसके बाद क्लाइंट के दोबारा कनेक्ट होने पर आपका सदस्य ऑथराइज़ेशन एंडपॉइंट 403 Forbidden लौटा सकता है।
अगले कदम
- चैनलों को अधिकृत करना में वह दूसरा सिग्नेचर बताया गया है जिसे आपका बैकएंड प्राइवेट और प्रेज़ेंस सब्सक्रिप्शन के लिए बनाता है।
- किसी सदस्य को डिस्कनेक्ट करें इस अनुरोध का पूरा API संदर्भ है।
- किसी सदस्य को इवेंट भेजना सदस्य को संबोधित दूसरा ऑपरेशन है।
- प्रेज़ेंस चैनल बताते हैं कि एक सदस्य के कई कनेक्शन क्यों हो सकते हैं।
संबंधित संसाधन
इस विषय के लिए दस्तावेज़, गाइड और उदाहरणों के साथ आगे बढ़ें।