شناخت کی تصدیق
سائن اِن شخص کو پہچانیں اور اس کی گفتگو کا تاریخچہ ہر ڈیوائس پر بحال کریں — ایسے دستخط کے ذریعے جو آپ کے backend کے قابو میں ہے۔
تصدیق کیوں ضروری ہے#
طے شدہ طور پر SDK گمنام ہوتا ہے: یہ ایک مستقل visitor_id بناتا ہے اور اسے پلیٹ فارم کے keystore میں رکھتا ہے۔ ایک ڈیوائس پر ایک گفتگو کے لیے یہ کافی ہے۔ کسی مخصوص صارف کو پہچاننے، دوبارہ لاگ اِن یا کسی دوسری ڈیوائس پر تاریخچہ بحال کرنے، اور گفتگو کو رابطے کی پروفائل سے بھروسے کے ساتھ جوڑنے کے لیے backend کو ثبوت چاہیے کہ کلائنٹ وہی ہے جو خود کو بتا رہا ہے۔ اگر SDK بس اتنا بھیج دیتا کہ "میں صارف 42 ہوں"، تو کوئی بھی کسی اور کی id بنا کر اُس کی چیٹ پڑھ سکتا تھا — اسی لیے Respondo ایک خفیہ نگاری والا دستخط مانگتا ہے، userHash، جو صرف آپ کا backend بنا سکتا ہے۔
identity secret حاصل کرنا#
identity_secret ایک خفیہ سٹرنگ ہے جو آپ کے ایجنٹ سے بندھی ہوتی ہے (وہ AI کارکن جس سے آپ کا ویجٹ چینل جڑا ہوا ہے)۔ اسے ڈیش بورڈ میں Channels → Widget → Identity verification کے تحت بنائیں۔ چونکہ یہ ایجنٹ پر رہتی ہے، اس ایجنٹ سے چلنے والا ہر چینل — ویب ویجٹ ہو یا موبائل SDK — وہی ایک سیکرٹ استعمال کرتا ہے۔ یہ شناختوں پر دستخط کا حق دیتی ہے، اس لیے اسے صرف آپ کے backend پر رہنا چاہیے اور ایپ کے ساتھ کبھی نہیں بھیجنا چاہیے۔
userHash کا فارمولا#
userHash ایک ہی دستخط شدہ شناختی سٹرنگ پر HMAC-SHA256 ہے، جو چھوٹے حروف والے hex میں انکوڈ ہوتا ہے:
userHash = HMAC_SHA256( identity_secret, payload )
payload = userId // اگر userId مقرر ہو
= email // ورنہ، اگر email مقرر ہو
= (invalid) // دونوں خالی ہوں تو دستخط کے لیے کچھ نہیں- سیکرٹ HMAC کی کلید ہے؛ شناختی سٹرنگ پیغام ہے — اس کا الٹ نہیں۔
- بالکل ایک ہی سٹرنگ پر دستخط کریں — خام
userId(یا ای میل)، بغیر کسی salt یا JSON ریپر کے۔ - اگر آپ
userIdاور ای میل دونوں بھیجیں، توuserIdپر دستخط کریں (اسے ترجیح حاصل ہے)۔ - نتیجہ hex ہوتا ہے (SHA-256 کے لیے 64 حروف)، base64 نہیں۔
backend کی مثالیں#
دستخط اپنے backend پر بنائیں اور تیار userHash ایپ کو دے دیں۔
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
)
// HMAC_SHA256(identity_secret, userId) بطور چھوٹے حروف والا hex۔
func ComputeUserHash(identitySecret, userID string) string {
mac := hmac.New(sha256.New, []byte(identitySecret))
mac.Write([]byte(userID))
return hex.EncodeToString(mac.Sum(nil))
}const crypto = require("crypto");
// وہ userHash لوٹاتا ہے جو موبائل کلائنٹ پر Respondo.identify کو دینا ہے۔
function computeUserHash(identitySecret, userId) {
return crypto
.createHmac("sha256", identitySecret)
.update(userId, "utf8")
.digest("hex");
}import hmac
import hashlib
# وہ userHash لوٹاتا ہے جو موبائل کلائنٹ پر Respondo.identify کو دینا ہے۔
def compute_user_hash(identity_secret: str, user_id: str) -> str:
return hmac.new(
identity_secret.encode(),
user_id.encode(),
hashlib.sha256,
).hexdigest()<?php
// وہ userHash لوٹاتا ہے جو موبائل کلائنٹ پر Respondo.identify کو دینا ہے۔
function computeUserHash(string $identitySecret, string $userId): string {
return hash_hmac('sha256', $userId, $identitySecret);
}ہیش Respondo تک کیسے پہنچتا ہے#
/identity روٹ نہیں، اور نہ کچھ رجسٹر کرنا ہے۔ userHash ایک فیلڈ ہے جو انہی درخواستوں کے ساتھ جاتا ہے جو SDK پہلے ہی بھیجتا ہے۔دو مرحلے، اور بنانا صرف پہلا آپ کو ہے:
- آپ کا backend → آپ کی ایپ۔ ہیش آپ جیسے چاہیں پہنچائیں۔ سب سے سستا طریقہ یہ ہے کہ جو لاگ اِن/بوٹ سٹریپ جواب آپ پہلے ہی لوٹاتے ہیں، اسی میں ایک اضافی فیلڈ ڈال دیں — کوئی اضافی راؤنڈ ٹرپ نہیں۔ آپ کے اپنے backend پر ایک الگ اینڈ پوائنٹ (مثلاً
POST /myapp/identityجو{ userId, userHash }لوٹائے) بھی اتنا ہی اچھا کام کرتا ہے۔ وہ اینڈ پوائنٹ Respondo نہیں چلاتا — اسے آپ بناتے ہیں۔ - آپ کی ایپ → Respondo۔ یہ آپ کے لیے سنبھال لیا گیا ہے۔ جیسے ہی آپ
identifyکال کرتے ہیں، SDK ہر متعلقہ درخواست کے ساتھ ہیش لگا دیتا ہے اور backend ہر بار اس کی دوبارہ تصدیق کرتا ہے۔
POST /api/v1/chat body identity.userHash
GET /api/v1/chat/resume query user_hash
GET /api/v1/chat/history query user_hash
GET /api/v1/chat/ws frames user_hash (subscribe/identify JSON frames after connect — not in the handshake URL)
GET /api/v1/widget/tours query user_hash
GET /api/v1/widget/checklists query user_hash
POST /api/v1/widget/push/register body user_hashہیش کی جانچ ہر درخواست پر دوبارہ ہوتی ہے، اسے ایک بار سیشن کے بدلے نہیں لیا جاتا — اسی لیے چُرایا ہوا userId اکیلا کسی کام کا نہیں رہتا۔
identify کبھی کال نہیں ہوتا، اور چیٹ گمنام حالت میں چلتی ہے۔ یہ متوقع رویّہ ہے، Respondo کی خرابی نہیں — آپ کے اپنے راستے پر 404 کا مطلب ہے کہ کام آپ کی طرف باقی ہے، انٹیگریشن ٹوٹی ہوئی نہیں۔SDK کو شناخت بھیجنا#
دستخط شدہ شناخت اپنے backend سے لیں، پھر کسی بھی پلیٹ فارم پر userHash کو identify میں دے دیں:
Respondo.identify(
RespondoIdentity(userId = "42", email = "user@example.com", userHash = hash),
)Respondo.identify(
RespondoIdentity(userId: "42", email: "user@example.com", userHash: hash)
)Respondo.identify(RespondoIdentity(
userId: '42', email: 'user@example.com', userHash: hash,
));غلط userHash پر رویّہ#
جب ایجنٹ پر تصدیق آن ہو اور دستخط موجود نہ ہو یا غلط ہو، تو backend خاموشی سے گمنام حالت پر واپس لے آتا ہے: چیٹ پھر بھی چلتی ہے، visitor_id برقرار رہتا ہے، اور گفتگو گمنام رابطے سے بندھ جاتی ہے — لیکن پروفائل سے کوئی ربط نہیں رہتا اور نہ ڈیوائسز کے درمیان تاریخچہ۔ اگر کوئی صارف "پہچانا نہیں جاتا"، تو معاملہ تقریباً ہمیشہ دستخط کا ہوتا ہے: جانچیں کہ آپ نے userId پر دستخط کیا (ای میل یا JSON پر نہیں)، درست identity_secret استعمال کیا، اور چھوٹے حروف والا hex دیا۔ اگر ایجنٹ کا identity_secret خالی ہو تو تصدیق بند رہتی ہے اور userId / ای میل جیسے ہیں ویسے قبول کر لیے جاتے ہیں۔
identity_secret بدلنا عملاً ایک ہی جھٹکے میں مکمل تبدیلی ہے: پرانے سیکرٹ سے بنے تمام ہیش فوراً تصدیق میں ناکام ہو جاتے ہیں، اس لیے پہلے سے سائن اِن صارف خاموشی سے گمنام حالت پر آ جاتے ہیں، جب تک آپ کا backend نئے سیکرٹ سے ان کا userHash دوبارہ بنا کر نہ دے۔ سیکرٹ صرف اُس وقت بدلیں جب دستخط کرنے والی طرف کو بھی اسی وقت اپ ڈیٹ کر سکیں۔