เอกสารประกอบ

การระบุตัวตนผู้ใช้

การระบุตัวตนผู้ใช้เชื่อมเซสชันแชทแบบไม่ระบุตัวตนเข้ากับโปรไฟล์ผู้ใช้จริง

ทำงานอย่างไร

เมื่อคุณเรียก Respondo.identify() ฟิลด์ที่ให้มาจะถูกแนบเข้ากับบทสนทนา ทุกฟิลด์เป็นทางเลือก — ส่งเฉพาะฟิลด์ที่คุณมีก็ได้ ตัวอย่างเช่น คุณ สามารถส่งแค่ userId โดยไม่ต้องมีอีเมลหรือชื่อ เจ้าหน้าที่ซัพพอร์ตจะเห็นข้อมูลนี้ในแผงรายละเอียดบทสนทนา

พารามิเตอร์#

คุณสมบัติประเภทจำเป็นคำอธิบาย
emailstringทางเลือกที่อยู่อีเมลของผู้ใช้
namestringทางเลือกชื่อที่แสดง
userIdstringทางเลือกID ผู้ใช้ภายในหรือ ID ที่แสดงของคุณ — แสดงตามที่เป็นในแดชบอร์ด
userHashstringทางเลือกลายเซ็น HMAC-SHA256 สำหรับการยืนยันตัวตน
metadataobjectทางเลือกคู่คีย์-ค่าของฟิลด์กำหนดเอง (plan, company ฯลฯ)
propertiesobjectทางเลือกคุณสมบัติของผู้ติดต่อแบบกำหนดเองที่กำหนดใน Agent Settings คีย์ต้องตรงกับนิยาม คุณสมบัติ ค่าจะถูกจัดเก็บด้วยคำนำหน้า cp_ และสามารถกรองได้ในกล่องข้อความ
ตัวอย่าง: Single Page Appjavascript
// หลังจากล็อกอินสำเร็จ
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 ด้วยตนเองและเรียก identify() ก่อนที่จะเคยเรียก init() เลย — ในการติดตั้งแบบแมนวลให้เรียก init() ก่อนเสมอ

ผู้เยี่ยมชมแบบไม่ระบุตัวตน#

หากคุณไม่เรียก identify() วิดเจ็ตจะ กำหนด visitor 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 สำหรับช่องทางนั้น การเรียก identify() ใด ๆ ที่มีอีเมลหรือ userId โดยไม่มี userHash ที่ถูกต้อง จะถูกถอดออกฝั่งเซิร์ฟเวอร์ และผู้เยี่ยมชมยังคงเป็นนิรนาม — ดู การยืนยันตัวตน (HMAC) ด้านล่าง

visitor ID จะคงอยู่ข้ามเซสชันบนเบราว์เซอร์เดียวกัน โดยจะไม่ถูกส่งไปยัง Respondo ในฐานะ ตัวตนที่ผ่านการยืนยัน — ใช้เพื่อความต่อเนื่องของบทสนทนาแบบไม่ระบุตัวตนเท่านั้น

การระบุตัวตนด้วย userId เท่านั้น (ไม่มีอีเมลหรือชื่อ)#

หากแพลตฟอร์มของคุณไม่มีอีเมลหรือชื่อผู้ใช้ — เช่น คุณมีเพียง ID ที่แสดงภายในเท่านั้น — คุณสามารถส่งแค่ userId ได้ ไม่จำเป็น ต้องมีฟิลด์อื่น แดชบอร์ดจะแสดง userId ตามที่เป็นในรายละเอียดบทสนทนา

userId + metadata (ไม่มีอีเมลหรือชื่อ)javascript
// แพลตฟอร์มของคุณมีเพียง display 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: identify() แบบเลื่อนเวลาผ่าน dataLayerjavascript
// 1. เริ่มต้นวิดเจ็ตทันที (GTM tag)
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. เปิดใช้งานการยืนยันตัวตนในการตั้งค่าช่องทางของคุณ — คุณจะได้รับ secret key
  2. บน เซิร์ฟเวอร์ของคุณ ให้คำนวณ HMAC-SHA256(secret, userId) — secret คือ key และ userId คือ message — แล้วส่งผลลัพธ์ไปยังฟรอนต์เอนด์ หากคุณระบุตัวตนผู้ใช้ด้วยอีเมลเท่านั้น (ไม่มี userId) ให้เซ็นอีเมลแทน: payload ที่ถูกเซ็นคือ userId เมื่อมีการตั้งค่า มิฉะนั้นคืออีเมล หากคุณส่งทั้งคู่ ให้เซ็น userId เพราะมันมีความสำคัญเหนือกว่า
  3. ส่งค่าแฮชเป็น userHash ใน Respondo.identify()
  4. Respondo จะตรวจสอบแฮชฝั่งเซิร์ฟเวอร์ หากไม่ถูกต้อง ตัวตนจะถูกถอดออกและผู้ใช้จะถูกถือ ว่าเป็นผู้ใช้แบบไม่ระบุตัวตน
อย่าเปิดเผย secret key ของคุณในโค้ดฝั่งฟรอนต์เอนด์เด็ดขาด ต้องคำนวณ HMAC บนแบ็กเอนด์ ของคุณ
เมื่อเปิดใช้การยืนยันแล้ว การเรียก identify() ทุกครั้ง ที่มี userId หรือ email ต้องแนบ 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 endpoint ของคุณ:
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()

# ใน view / endpoint ของคุณ:
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
});