दस्तावेज़

यूज़र पहचान

यूज़र्स की पहचान करने से एनॉनिमस चैट सेशन असली यूज़र प्रोफ़ाइल से जुड़ जाते हैं।

यह कैसे काम करता है

जब आप Respondo.identify() कॉल करते हैं, तो दिए गए फ़ील्ड बातचीत से जुड़ जाते हैं। सभी फ़ील्ड वैकल्पिक हैं — केवल वही पास करें जो आपके पास हैं। उदाहरण के लिए, आप ईमेल या नाम के बिना केवल userId भेज सकते हैं। सपोर्ट एजेंट यह डेटा बातचीत विवरण पैनल में देखते हैं।

पैरामीटर#

प्रॉपर्टीटाइपआवश्यकविवरण
emailstringवैकल्पिकयूज़र का ईमेल पता
namestringवैकल्पिकप्रदर्शित नाम
userIdstringवैकल्पिकआपका आंतरिक यूज़र या डिस्प्ले ID — डैशबोर्ड में जैसा है वैसा दिखाया जाता है
userHashstringवैकल्पिकपहचान सत्यापन के लिए HMAC-SHA256 सिग्नेचर
metadataobjectवैकल्पिककस्टम फ़ील्ड के की-वैल्यू जोड़े (plan, company, आदि)
propertiesobjectवैकल्पिकAgent Settings में परिभाषित कस्टम कॉन्टैक्ट प्रॉपर्टीज़। कीज़ को प्रॉपर्टी परिभाषाओं से मेल खाना चाहिए। वैल्यूज़ cp_ प्रीफ़िक्स के साथ स्टोर की जाती हैं और इनबॉक्स में फ़िल्टर की जा सकती हैं।
उदाहरण: सिंगल पेज ऐपjavascript
// सफल लॉगिन के बाद
async function onLogin(user) {
  await authenticateUser(user);

  Respondo.identify({
    email: user.email,
    name: user.fullName,
    userId: user.id,
    metadata: {
      plan: user.subscription.plan,
      company: user.company.name,
      role: user.role,
      signedUp: user.createdAt
    },
    properties: {                        // कस्टम कॉन्टैक्ट प्रॉपर्टीज़
      account_type: user.accountType,    // Agent Settings की कीज़ से मेल खाना चाहिए
      industry: user.industry,
      contract_tier: user.tier
    }
  });
}
स्टैंडर्ड इंस्टॉल स्निपेट के साथ आप identify() को किसी भी समय कॉल कर सकते हैं — widget.js के लोड होने से पहले किए गए कॉल स्निपेट द्वारा कतार में रखे जाते हैं और विजेट के इनिशियलाइज़ होते ही अपने आप दोबारा चला दिए जाते हैं। पहचान डेटा केवल तभी छोड़ा जाता है (कंसोल चेतावनी के साथ) जब आप widget.js को ख़ुद लोड करते हैं और कभी init() कॉल किए बिना identify() कॉल करते हैं — मैनुअल सेटअप में हमेशा पहले init() कॉल करें।

एनॉनिमस विज़िटर#

अगर आप identify() कॉल नहीं करते, तो विजेट अपने आप एक स्थायी विज़िटर ID असाइन कर देता है जो localStorage में (की respondoai_visitor_id) स्टोर होती है। डैशबोर्ड में बातचीत Guest · Web widget के रूप में दिखती है।

मोडडैशबोर्ड प्रदर्शनHMAC आवश्यक
बिना identify()Guest · Web widgetनहीं
identify({ email, name })नाम + ईमेल दिखता हैनहीं — जब तक Identity Verification सक्षम न हो; तब बिना हस्ताक्षर वाले ईमेल/नाम चुपचाप हटा दिए जाते हैं और सेशन एनॉनिमस रहता है
identify({ userId })userId जैसा है वैसा दिखता हैनहीं — जब तक Identity Verification सक्षम न हो; तब एक मान्य userHash आवश्यक है, वरना पहचान हटा दी जाती है
identify({ userId, userHash })सत्यापित यूज़र पहचानहाँ — क्रिप्टोग्राफ़िक रूप से सत्यापित

जब चैनल के लिए Identity Verification सक्षम होता है, तो ईमेल या userId ले जाने वाला हर identify() बिना मान्य userHash के सर्वर-साइड हटा दिया जाता है और विज़िटर एनॉनिमस बना रहता है — नीचे पहचान सत्यापन (HMAC) देखें।

विज़िटर ID एक ही ब्राउज़र पर सेशन के बीच बनी रहती है। इसे कभी भी एक प्रमाणित पहचान के रूप में Respondo को नहीं भेजा जाता — इसका उपयोग केवल एनॉनिमस बातचीत की निरंतरता के लिए होता है।

केवल-userId पहचान (बिना ईमेल या नाम)#

अगर आपके प्लेटफ़ॉर्म पर यूज़र के ईमेल या नाम नहीं हैं — उदाहरण के लिए, आपके पास केवल एक आंतरिक डिस्प्ले ID है — तो आप केवल userId पास कर सकते हैं। किसी अन्य फ़ील्ड की ज़रूरत नहीं है। डैशबोर्ड बातचीत विवरण में userId को जैसा है वैसा दिखाएगा।

userId + metadata (बिना ईमेल या नाम)javascript
// आपके प्लेटफ़ॉर्म पर केवल एक डिस्प्ले ID है — वह पर्याप्त है
Respondo.identify({
  userId: user.displayId,      // उदा. "USR-4821" — डैशबोर्ड में दिखता है
  metadata: {                  // वैकल्पिक अतिरिक्त संदर्भ
    plan: 'premium',
    region: 'eu-west'
  }
});
// ईमेल या नाम की ज़रूरत नहीं — विजेट केवल userId के साथ काम करता है
userId की स्पूफ़िंग रोकने के लिए, इसे userHash के साथ जोड़ें (नीचे पहचान सत्यापन देखें)। HMAC के बिना, कोई भी ब्राउज़र कंसोल से कोई भी userId पास कर सकता है।

Google Tag Manager / विलंबित identify()#

GTM के ज़रिए एम्बेड करते समय, पेज लोड के समय यूज़र डेटा उपलब्ध नहीं हो सकता। दो तरीके:

विकल्प A: localStorageKey (शून्य JS की ज़रूरत)javascript
// अगर आपका प्लेटफ़ॉर्म पहले से यूज़र ID को localStorage में लिखता है:
Respondo.init({
  agentId: 'YOUR_AGENT_ID',
  localStorageKey: 'myapp_user_id'  // localStorage.getItem('myapp_user_id') अपने आप पढ़ता है
});
// identify() कॉल की ज़रूरत नहीं — विजेट ख़ुद userId उठा लेता है
विकल्प B: dataLayer के ज़रिए विलंबित identify()javascript
// 1. विजेट को तुरंत इनिशियलाइज़ करें (GTM टैग)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });

// 2. बाद में, जब यूज़र डेटा दिखे (उदा. dataLayer या आपके ऐप से):
var waitForUser = setInterval(function() {
  var uid = localStorage.getItem('myapp_user_id');
  if (uid && window.Respondo && typeof window.Respondo.identify === 'function') {
    clearInterval(waitForUser);
    Respondo.identify({ userId: uid });
  }
}, 500);
localStorageKey का उपयोग केवल तब होता है जब userId पहले से identify() के ज़रिए सेट न हो। स्पष्ट identify() कॉल हमेशा प्राथमिकता लेते हैं।

पहचान सत्यापन (HMAC)#

सत्यापन के बिना, कोई भी नकली userId या email पास करके किसी यूज़र का प्रतिरूपण कर सकता है। पहचान सत्यापन HMAC-SHA256 का उपयोग करके क्रिप्टोग्राफ़िक रूप से यह साबित करता है कि यूज़र की पहचान आपके सर्वर द्वारा सेट की गई थी, न कि क्लाइंट-साइड कोड द्वारा।

यह कैसे काम करता है#

  1. अपनी चैनल सेटिंग्स में पहचान सत्यापन सक्षम करें — आपको एक सीक्रेट की मिलेगी।
  2. अपने सर्वर पर, HMAC-SHA256(secret, userId) की गणना करें — secret ही key है, userId ही message — और परिणाम फ्रंटएंड को भेजें। अगर आप यूज़र्स को केवल ईमेल से पहचानते हैं (कोई userId नहीं), तो ईमेल पर हस्ताक्षर करें: हस्ताक्षरित payload userId होता है जब वह सेट हो, अन्यथा ईमेल। अगर आप दोनों पास करते हैं, तो userId पर हस्ताक्षर करें; उसे प्राथमिकता मिलती है।
  3. हैश को userHash के रूप में Respondo.identify() में पास करें।
  4. Respondo हैश को सर्वर-साइड सत्यापित करता है। अगर अमान्य है, तो पहचान हटा दी जाती है और यूज़र को एनॉनिमस माना जाता है।
अपनी सीक्रेट की को फ्रंटएंड कोड में कभी उजागर न करें। HMAC की गणना आपके बैकएंड पर होनी चाहिए।
सत्यापन सक्षम हो जाने के बाद, userId या email ले जाने वाले हर identify() में एक मान्य userHash शामिल होना चाहिए — अन्यथा पहचान फ़ील्ड हटा दिए जाते हैं और विज़िटर को एनॉनिमस माना जाता है।

सर्वर-साइड उदाहरण#

Node.jsjavascript
const crypto = require('crypto');

const SECRET = process.env.RESPONDO_IDENTITY_SECRET;

function generateUserHash(userId) {
  return crypto
    .createHmac('sha256', SECRET)
    .update(userId)
    .digest('hex');
}

// आपके API एंडपॉइंट में:
app.get('/api/respondo-hash', (req, res) => {
  const hash = generateUserHash(req.user.id);
  res.json({ userHash: hash });
});
Pythonpython
import hmac, hashlib, os

SECRET = os.environ['RESPONDO_IDENTITY_SECRET']

def generate_user_hash(user_id: str) -> str:
    return hmac.new(
        SECRET.encode(),
        user_id.encode(),
        hashlib.sha256
    ).hexdigest()

# आपके व्यू / एंडपॉइंट में:
user_hash = generate_user_hash(request.user.id)
Gogo
import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
)

func GenerateUserHash(userID, secret string) string {
    mac := hmac.New(sha256.New, []byte(secret))
    mac.Write([]byte(userID))
    return hex.EncodeToString(mac.Sum(nil))
}

फ्रंटएंड उपयोग#

पहचान सत्यापन के साथjavascript
// हैश को अपने सर्वर से लाएँ
const { userHash } = await fetch('/api/respondo-hash').then(r => r.json());

Respondo.identify({
  email: user.email,
  name: user.name,
  userId: user.id,
  userHash: userHash  // HMAC-SHA256 सिग्नेचर
});