Identifikasi Pengguna
Mengidentifikasi pengguna menghubungkan sesi chat anonim dengan profil pengguna nyata.
Cara kerjanya
Ketika Anda memanggil Respondo.identify(), bidang yang disediakan dilampirkan ke percakapan. Semua bidang bersifat opsional — kirimkan hanya yang Anda miliki. Misalnya, Anda dapat mengirim hanya userId tanpa email atau nama. Agen dukungan melihat data ini di panel detail percakapan.
Parameter#
| Properti | Tipe | Wajib | Deskripsi |
|---|---|---|---|
| string | opsional | Alamat email pengguna | |
| name | string | opsional | Nama tampilan |
| userId | string | opsional | ID pengguna atau ID tampilan internal Anda — ditampilkan apa adanya di dashboard |
| userHash | string | opsional | Tanda tangan HMAC-SHA256 untuk verifikasi identitas |
| metadata | object | opsional | Pasangan key-value dari bidang khusus (plan, company, dsb.) |
| properties | object | opsional | Properti kontak khusus yang didefinisikan di Agent Settings. Key harus cocok dengan definisi properti. Nilai disimpan dengan prefiks cp_dan dapat difilter di Inbox. |
// Setelah login berhasil
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: { // properti kontak khusus
account_type: user.accountType, // harus cocok dengan key dari Agent Settings
industry: user.industry,
contract_tier: user.tier
}
});
}identify() kapan saja — panggilan yang dibuat sebelum widget.js selesai dimuat akan diantrekan oleh cuplikan dan diputar ulang secara otomatis setelah widget terinisialisasi. Data identitas hanya dibuang (dengan peringatan di konsol) jika Anda memuat widget.js sendiri dan memanggil identify() sebelum pernah memanggil init() — selalu panggil init() terlebih dahulu pada penyiapan manual.Pengunjung Anonim#
Jika Anda tidak memanggil identify(), widget secara otomatis menetapkan visitor ID permanen yang disimpan di localStorage (key respondoai_visitor_id). Di dashboard, percakapan muncul sebagai Guest · Web widget.
| Mode | Tampilan dashboard | HMAC diperlukan |
|---|---|---|
Tanpa identify() | Guest · Web widget | Tidak |
identify({ email, name }) | Nama + email ditampilkan | Tidak — kecuali Verifikasi Identitas diaktifkan; jika ya, email/nama tanpa tanda tangan akan dihapus secara diam-diam dan sesi tetap anonim |
identify({ userId }) | userId ditampilkan apa adanya | Tidak — kecuali Verifikasi Identitas diaktifkan; jika ya, userHash yang valid diperlukan atau identitas akan dihapus |
identify({ userId, userHash }) | Identitas pengguna terverifikasi | Ya — terverifikasi secara kriptografis |
Ketika Verifikasi Identitas diaktifkan untuk channel, setiap identify() yang membawa email atau userId tanpa userHash yang valid akan dihapus di sisi server dan pengunjung tetap anonim — lihat Verifikasi Identitas (HMAC) di bawah.
Identifikasi hanya userId (tanpa email atau nama)#
Jika platform Anda tidak memiliki email atau nama pengguna — misalnya, Anda hanya memiliki ID tampilan internal — Anda dapat mengirim hanya userId. Tidak ada bidang lain yang diperlukan. Dashboard akan menampilkan userId apa adanya di detail percakapan.
// Platform Anda hanya memiliki ID tampilan — itu sudah cukup
Respondo.identify({
userId: user.displayId, // mis. "USR-4821" — ditampilkan di dashboard
metadata: { // konteks tambahan opsional
plan: 'premium',
region: 'eu-west'
}
});
// Tidak perlu email atau nama — widget bekerja hanya dengan userIduserHash (lihat Verifikasi Identitas di bawah). Tanpa HMAC, siapa pun dapat mengirim userId apa pun dari konsol browser.Google Tag Manager / identify() tertunda#
Saat menyematkan melalui GTM, data pengguna mungkin belum tersedia saat halaman dimuat. Dua pendekatan:
// Jika platform Anda sudah menulis ID pengguna ke localStorage:
Respondo.init({
agentId: 'YOUR_AGENT_ID',
localStorageKey: 'myapp_user_id' // membaca localStorage.getItem('myapp_user_id') secara otomatis
});
// Tidak perlu memanggil identify() — widget mengambil userId dengan sendirinya// 1. Inisialisasi widget segera (tag GTM)
Respondo.init({ agentId: 'YOUR_AGENT_ID' });
// 2. Nanti, ketika data pengguna muncul (mis. dari dataLayer atau aplikasi Anda):
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 hanya digunakan jika belum ada userId yang ditetapkan melalui identify(). Panggilan identify() eksplisit selalu diprioritaskan.Verifikasi Identitas (HMAC)#
Tanpa verifikasi, siapa pun dapat menyamar sebagai pengguna dengan mengirim userId atau email palsu. Verifikasi Identitas menggunakan HMAC-SHA256 untuk membuktikan secara kriptografis bahwa identitas pengguna ditetapkan oleh server Anda, bukan oleh kode sisi klien.
Cara kerjanya#
- Aktifkan Verifikasi Identitas di pengaturan channel Anda — Anda akan mendapatkan secret key.
- Di server Anda, hitung
HMAC-SHA256(secret, userId)— secret adalah key-nya, userId adalah pesannya — dan kirim hasilnya ke frontend. Jika Anda mengidentifikasi pengguna hanya dengan email (tanpa userId), tandatangani email tersebut: payload yang ditandatangani adalah userId jika ada, jika tidak email. Jika Anda mengirim keduanya, tandatangani userId; itu yang diprioritaskan. - Kirim hash tersebut sebagai
userHashdiRespondo.identify(). - Respondo memverifikasi hash di sisi server. Jika tidak valid, identitas dihapus dan pengguna diperlakukan sebagai anonim.
identify() yang membawa userId atau email harus menyertakan userHash yang valid — jika tidak, bidang identitas akan dihapus dan pengunjung diperlakukan sebagai anonim.Contoh sisi server#
const crypto = require('crypto');
const SECRET = process.env.RESPONDO_IDENTITY_SECRET;
function generateUserHash(userId) {
return crypto
.createHmac('sha256', SECRET)
.update(userId)
.digest('hex');
}
// Di endpoint API Anda:
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()
# Di view / endpoint Anda:
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))
}Penggunaan di frontend#
// Ambil hash dari server ANDA
const { userHash } = await fetch('/api/respondo-hash').then(r => r.json());
Respondo.identify({
email: user.email,
name: user.name,
userId: user.id,
userHash: userHash // tanda tangan HMAC-SHA256
});