ユーザーの識別
ユーザーを識別すると、匿名のチャットセッションが実際のユーザープロフィールと結び付きます。
仕組み
Respondo.identify() を呼び出すと、指定したフィールドが会話に添付されます。 すべてのフィールドは任意です — 手元にあるものだけを渡してください。たとえば、メールや名前なしで userId だけを送信することもできます。サポート担当者はこのデータを会話詳細パネルで確認できます。
パラメータ#
| プロパティ | 型 | 必須 | 説明 |
|---|---|---|---|
| string | 任意 | ユーザーのメールアドレス | |
| name | string | 任意 | 表示名 |
| userId | string | 任意 | 社内のユーザー ID または表示 ID — ダッシュボードにそのまま表示されます |
| userHash | string | 任意 | 本人確認のための HMAC-SHA256 署名 |
| metadata | object | 任意 | カスタムフィールドのキーと値のペア(plan、company など) |
| properties | object | 任意 | Agent Settings で定義されたカスタムの連絡先プロパティ。キーはプロパティ定義と一致している必要があります。値は cp_ プレフィックス付きで保存され、Inbox でフィルタリングできます。 |
// ログイン成功後
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() を呼び出さない場合、ウィジェットはlocalStorage(キー respondoai_visitor_id)に保存される永続的な 訪問者 ID を自動的に割り当てます。ダッシュボードでは、その会話は Guest · Web widget として表示されます。
| モード | ダッシュボード表示 | HMAC の要否 |
|---|---|---|
identify() なし | Guest · Web widget | 不要 |
identify({ email, name }) | 名前とメールを表示 | 不要 — ただし本人確認が有効な場合は、署名のないメール/名前は黙って取り除かれ、セッションは匿名のままになります |
identify({ userId }) | userId をそのまま表示 | 不要 — ただし本人確認が有効な場合は、有効な userHash が必須で、なければ身元は取り除かれます |
identify({ userId, userHash }) | 検証済みのユーザー ID | 必要 — 暗号的に検証されます |
チャネルで本人確認が有効になっている場合、有効な userHash を伴わずにメールや userId を含む identify() はサーバー側で取り除かれ、訪問者は匿名のままになります — 下記の本人確認(HMAC)を参照してください。
userId のみによる識別(メールや名前なし)#
プラットフォームにユーザーのメールや名前がない場合 — たとえば社内の表示 ID しかない場合 — userId だけを渡すことができます。他のフィールドは不要です。ダッシュボードは会話詳細に userId をそのまま表示します。
// プラットフォームに表示 ID しかなくても十分です
Respondo.identify({
userId: user.displayId, // 例: "USR-4821" — ダッシュボードに表示されます
metadata: { // 任意の追加コンテキスト
plan: 'premium',
region: 'eu-west'
}
});
// メールや名前は不要 — ウィジェットは userId だけで動作しますuserHash と組み合わせてください(下記の本人確認を参照)。HMAC がないと、誰でもブラウザのコンソールから任意の userId を渡せてしまいます。Google Tag Manager / 遅延 identify()#
GTM 経由で埋め込む場合、ページ読み込み時点ではユーザーデータが利用できないことがあります。2 つのアプローチがあります:
// プラットフォームがすでにユーザー ID を localStorage に書き込んでいる場合:
Respondo.init({
agentId: 'YOUR_AGENT_ID',
localStorageKey: 'myapp_user_id' // localStorage.getItem('myapp_user_id') を自動的に読み取ります
});
// identify() の呼び出しは不要 — ウィジェットが自動的に userId を取得します// 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 は、 identify() によって userId がまだ設定されていない場合にのみ使用されます。明示的な identify() の呼び出しが常に優先されます。本人確認(HMAC)#
検証がない場合、偽の userId や email を渡すことで誰でもユーザーになりすませてしまいます。本人確認は HMAC-SHA256 を使用して、ユーザーの ID がクライアント側のコードではなくあなたのサーバーによって設定されたことを暗号的に証明します。
仕組み#
- チャネル設定で本人確認を有効にします — シークレットキーが発行されます。
- あなたのサーバーで
HMAC-SHA256(secret, userId)を計算し — シークレットが鍵、userId がメッセージです — その結果をフロントエンドに送信します。ユーザーをメールアドレスだけで識別する場合(userId なし)は、代わりにメールアドレスに署名します: 署名対象は userId が設定されていれば userId、なければメールアドレスです。両方を渡す場合は userId に署名します — userId が優先されます。 - そのハッシュを
Respondo.identify()のuserHashとして渡します。 - Respondo はサーバー側でハッシュを検証します。無効な場合、ID は取り除かれ、ユーザーは匿名として扱われます。
userId または email を含む すべての identify() に有効な 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 エンドポイント内:
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()
# ビュー / エンドポイント内:
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 署名
});