การระบุตัวตนผู้ใช้
การระบุตัวตนผู้ใช้เชื่อมเซสชันแชทแบบไม่ระบุตัวตนเข้ากับโปรไฟล์ผู้ใช้จริง
ทำงานอย่างไร
เมื่อคุณเรียก Respondo.identify() ฟิลด์ที่ให้มาจะถูกแนบเข้ากับบทสนทนา ทุกฟิลด์เป็นทางเลือก — ส่งเฉพาะฟิลด์ที่คุณมีก็ได้ ตัวอย่างเช่น คุณ สามารถส่งแค่ userId โดยไม่ต้องมีอีเมลหรือชื่อ เจ้าหน้าที่ซัพพอร์ตจะเห็นข้อมูลนี้ในแผงรายละเอียดบทสนทนา
พารามิเตอร์#
| คุณสมบัติ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
| string | ทางเลือก | ที่อยู่อีเมลของผู้ใช้ | |
| name | string | ทางเลือก | ชื่อที่แสดง |
| userId | string | ทางเลือก | ID ผู้ใช้ภายในหรือ ID ที่แสดงของคุณ — แสดงตามที่เป็นในแดชบอร์ด |
| userHash | string | ทางเลือก | ลายเซ็น HMAC-SHA256 สำหรับการยืนยันตัวตน |
| metadata | object | ทางเลือก | คู่คีย์-ค่าของฟิลด์กำหนดเอง (plan, company ฯลฯ) |
| properties | object | ทางเลือก | คุณสมบัติของผู้ติดต่อแบบกำหนดเองที่กำหนดใน Agent Settings คีย์ต้องตรงกับนิยาม คุณสมบัติ ค่าจะถูกจัดเก็บด้วยคำนำหน้า cp_ และสามารถกรองได้ในกล่องข้อความ |
// หลังจากล็อกอินสำเร็จ
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) ด้านล่าง
การระบุตัวตนด้วย userId เท่านั้น (ไม่มีอีเมลหรือชื่อ)#
หากแพลตฟอร์มของคุณไม่มีอีเมลหรือชื่อผู้ใช้ — เช่น คุณมีเพียง ID ที่แสดงภายในเท่านั้น — คุณสามารถส่งแค่ userId ได้ ไม่จำเป็น ต้องมีฟิลด์อื่น แดชบอร์ดจะแสดง userId ตามที่เป็นในรายละเอียดบทสนทนา
// แพลตฟอร์มของคุณมีเพียง display ID เท่านั้น — นั่นก็เพียงพอแล้ว
Respondo.identify({
userId: user.displayId, // เช่น "USR-4821" — แสดงในแดชบอร์ด
metadata: { // บริบทเพิ่มเติมที่เป็นทางเลือก
plan: 'premium',
region: 'eu-west'
}
});
// ไม่จำเป็นต้องมีอีเมลหรือชื่อ — วิดเจ็ตทำงานได้ด้วย userId เท่านั้นuserHash (ดู การยืนยันตัวตน ด้านล่าง) หากไม่มี HMAC ใครก็สามารถส่ง userId ใดก็ได้จากคอนโซล ของเบราว์เซอร์Google Tag Manager / identify() แบบเลื่อนเวลา#
เมื่อฝังผ่าน GTM ข้อมูลผู้ใช้อาจยังไม่พร้อมใช้งานตอนที่หน้าเว็บโหลด มีสองแนวทาง:
// หากแพลตฟอร์มของคุณเขียน ID ผู้ใช้ลงใน localStorage อยู่แล้ว:
Respondo.init({
agentId: 'YOUR_AGENT_ID',
localStorageKey: 'myapp_user_id' // อ่าน localStorage.getItem('myapp_user_id') โดยอัตโนมัติ
});
// ไม่ต้องเรียก identify() — วิดเจ็ตจะดึง userId มาเอง// 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 เพื่อพิสูจน์ด้วยการเข้ารหัสว่าตัวตนของผู้ใช้ถูกกำหนดโดยเซิร์ฟเวอร์ ของคุณ ไม่ใช่โดยโค้ดฝั่งไคลเอนต์
ทำงานอย่างไร#
- เปิดใช้งานการยืนยันตัวตนในการตั้งค่าช่องทางของคุณ — คุณจะได้รับ secret key
- บน เซิร์ฟเวอร์ของคุณ ให้คำนวณ
HMAC-SHA256(secret, userId)— secret คือ key และ userId คือ message — แล้วส่งผลลัพธ์ไปยังฟรอนต์เอนด์ หากคุณระบุตัวตนผู้ใช้ด้วยอีเมลเท่านั้น (ไม่มี userId) ให้เซ็นอีเมลแทน: payload ที่ถูกเซ็นคือ userId เมื่อมีการตั้งค่า มิฉะนั้นคืออีเมล หากคุณส่งทั้งคู่ ให้เซ็น userId เพราะมันมีความสำคัญเหนือกว่า - ส่งค่าแฮชเป็น
userHashในRespondo.identify() - Respondo จะตรวจสอบแฮชฝั่งเซิร์ฟเวอร์ หากไม่ถูกต้อง ตัวตนจะถูกถอดออกและผู้ใช้จะถูกถือ ว่าเป็นผู้ใช้แบบไม่ระบุตัวตน
identify() ทุกครั้ง ที่มี userId หรือ email ต้องแนบ userHash ที่ถูกต้องมาด้วย — มิฉะนั้นฟิลด์ตัวตนจะถูกถอดออกและผู้เยี่ยมชมจะถูกถือว่าเป็นนิรนามตัวอย่างฝั่งเซิร์ฟเวอร์#
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 });
});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)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))
}การใช้งานฝั่งฟรอนต์เอนด์#
// ดึงค่าแฮชจากเซิร์ฟเวอร์ของคุณ
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
});