ドキュメント

ユーザーの識別

ユーザーを識別すると、匿名のチャットセッションが実際のユーザープロフィールと結び付きます。

仕組み

Respondo.identify() を呼び出すと、指定したフィールドが会話に添付されます。 すべてのフィールドは任意です — 手元にあるものだけを渡してください。たとえば、メールや名前なしで userId だけを送信することもできます。サポート担当者はこのデータを会話詳細パネルで確認できます。

パラメータ#

プロパティ型必須説明
emailstring任意ユーザーのメールアドレス
namestring任意表示名
userIdstring任意社内のユーザー ID または表示 ID — ダッシュボードにそのまま表示されます
userHashstring任意本人確認のための HMAC-SHA256 署名
metadataobject任意カスタムフィールドのキーと値のペア(plan、company など)
propertiesobject任意Agent Settings で定義されたカスタムの連絡先プロパティ。キーはプロパティ定義と一致している必要があります。値は cp_ プレフィックス付きで保存され、Inbox でフィルタリングできます。
例: シングルページアプリjavascript
// ログイン成功後
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)を参照してください。

訪問者 ID は同じブラウザ上でセッションをまたいで保持されます。認証済みの ID として Respondo に送信されることは一切なく、匿名の会話の継続性のためだけに使用されます。

userId のみによる識別(メールや名前なし)#

プラットフォームにユーザーのメールや名前がない場合 — たとえば社内の表示 ID しかない場合 — userId だけを渡すことができます。他のフィールドは不要です。ダッシュボードは会話詳細に userId をそのまま表示します。

userId + metadata(メールや名前なし)javascript
// プラットフォームに表示 ID しかなくても十分です
Respondo.identify({
  userId: user.displayId,      // 例: "USR-4821" — ダッシュボードに表示されます
  metadata: {                  // 任意の追加コンテキスト
    plan: 'premium',
    region: 'eu-west'
  }
});
// メールや名前は不要 — ウィジェットは userId だけで動作します
userId のなりすましを防ぐには、userHash と組み合わせてください(下記の本人確認を参照)。HMAC がないと、誰でもブラウザのコンソールから任意の userId を渡せてしまいます。

Google Tag Manager / 遅延 identify()#

GTM 経由で埋め込む場合、ページ読み込み時点ではユーザーデータが利用できないことがあります。2 つのアプローチがあります:

オプション A: localStorageKey(JS 不要)javascript
// プラットフォームがすでにユーザー ID を localStorage に書き込んでいる場合:
Respondo.init({
  agentId: 'YOUR_AGENT_ID',
  localStorageKey: 'myapp_user_id'  // localStorage.getItem('myapp_user_id') を自動的に読み取ります
});
// identify() の呼び出しは不要 — ウィジェットが自動的に userId を取得します
オプション B: dataLayer 経由の遅延 identify()javascript
// 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 がクライアント側のコードではなくあなたのサーバーによって設定されたことを暗号的に証明します。

仕組み#

  1. チャネル設定で本人確認を有効にします — シークレットキーが発行されます。
  2. あなたのサーバーで HMAC-SHA256(secret, userId) を計算し — シークレットが鍵、userId がメッセージです — その結果をフロントエンドに送信します。ユーザーをメールアドレスだけで識別する場合(userId なし)は、代わりにメールアドレスに署名します: 署名対象は userId が設定されていれば userId、なければメールアドレスです。両方を渡す場合は userId に署名します — userId が優先されます。
  3. そのハッシュを Respondo.identify() の userHash として渡します。
  4. Respondo はサーバー側でハッシュを検証します。無効な場合、ID は取り除かれ、ユーザーは匿名として扱われます。
シークレットキーをフロントエンドのコードで公開しないでください。HMAC は必ずバックエンドで計算する必要があります。
検証を有効にすると、userId または email を含む すべての identify() に有効な 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 エンドポイント内:
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()

# ビュー / エンドポイント内:
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 署名
});