Dokumentasi

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#

PropertiTipeWajibDeskripsi
emailstringopsionalAlamat email pengguna
namestringopsionalNama tampilan
userIdstringopsionalID pengguna atau ID tampilan internal Anda — ditampilkan apa adanya di dashboard
userHashstringopsionalTanda tangan HMAC-SHA256 untuk verifikasi identitas
metadataobjectopsionalPasangan key-value dari bidang khusus (plan, company, dsb.)
propertiesobjectopsionalProperti kontak khusus yang didefinisikan di Agent Settings. Key harus cocok dengan definisi properti. Nilai disimpan dengan prefiks cp_dan dapat difilter di Inbox.
Contoh: Single Page Appjavascript
// 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
    }
  });
}
Dengan cuplikan pemasangan standar Anda dapat memanggil 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.

ModeTampilan dashboardHMAC diperlukan
Tanpa identify()Guest · Web widgetTidak
identify({ email, name })Nama + email ditampilkanTidak — 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 adanyaTidak — kecuali Verifikasi Identitas diaktifkan; jika ya, userHash yang valid diperlukan atau identitas akan dihapus
identify({ userId, userHash })Identitas pengguna terverifikasiYa — 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.

Visitor ID bertahan di seluruh sesi pada browser yang sama. ID ini tidak pernah dikirim ke Respondo sebagai identitas terautentikasi — hanya digunakan untuk kesinambungan percakapan anonim.

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.

userId + metadata (tanpa email atau nama)javascript
// 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 userId
Untuk mencegah pemalsuan userId, pasangkan dengan userHash (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:

Opsi A: localStorageKey (tanpa perlu JS)javascript
// 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
Opsi B: identify() tertunda via dataLayerjavascript
// 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#

  1. Aktifkan Verifikasi Identitas di pengaturan channel Anda — Anda akan mendapatkan secret key.
  2. 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.
  3. Kirim hash tersebut sebagai userHash di Respondo.identify().
  4. Respondo memverifikasi hash di sisi server. Jika tidak valid, identitas dihapus dan pengguna diperlakukan sebagai anonim.
Jangan pernah mengekspos secret key Anda dalam kode frontend. HMAC harus dihitung di backend Anda.
Setelah verifikasi diaktifkan, setiap 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#

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');
}

// Di endpoint API Anda:
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()

# Di view / endpoint Anda:
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))
}

Penggunaan di frontend#

Dengan Verifikasi Identitasjavascript
// 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
});