メインコンテンツにスキップ

JWTを使ったIdentity VerificationからMessenger Securityへの移行

ユーザーのMessengerセッションをクロスユーザーなりすまし、セッション盗難、不正なデータ属性更新から保護する方法

対応者:Penny Gray

サイトにログインしたusers向けのMessengerを設置している場合、悪意ある者がusersになりすましたり不正なデータを送信するのを防ぐために、セキュリティを強化することが不可欠です。

お客様のセキュリティと柔軟性を向上させるために、Messengerでusersを認証するより安全でスケーラブルな方法としてJSON Web Tokens(JWTs)を導入しました。

現在Identity Verification(IDV)を使ってusersを認証している場合、JWTsに切り替えることで以下が得られます。

  • 認証のより高度な制御 – 固定設定に頼らず、自分でセッションの有効期限や取り消しを管理できます。

  • 強化されたセキュリティ – JWTsは時間制限付きの署名付きトークンを可能にし、リプレイ攻撃のリスクを減らします。

  • データセキュリティの向上 – 更新可能なusers属性を正確に定義し、機密データの露出を減らします。

  • 将来への備え – JWTsはIDVの推奨代替手段であり、認証システムを最新のベストプラクティスに合わせ続けます。


誰が移行すべきか?

この移行は現在IDVを使用しているすべてのお客様に関連し、特に以下の場合に推奨されます。

✅ セッションの有効期限やトークン取り消しをより細かく制御したい

✅ 安全でユーザー固有の属性更新を強制したい

✅ 機密性の高い顧客データを扱い、より強力な認証が必要な場合

✅ ワークスペースの長期的なセキュリティ改善を計画している場合

IDVは当面は動作しますが、JWTsは認証のベストプラクティスに沿ったよりモダンで安全な方法を提供します。このガイドでは移行手順を段階的に説明します。

JWTsを使わない場合、Messengerの会話履歴はどうなりますか?

MessengerチャネルにMessenger Security with JWTsが設定されていない場合、customersはMessengerで過去14日間の自分の会話履歴のみを閲覧できます。この制限は2026年4月にセキュリティ対策として導入されました。

customersの会話履歴の完全な表示を復元するには、以下の移行手順に従ってMessenger Security with JWTsを設定してください。JWTsがプラットフォームで有効になると、そのプラットフォームの14日制限は解除されます。

14日より古い会話はMessengerではcustomersからは非表示ですが、削除されてはいません。Inboxのチームメンバーには表示され続けます。詳細はUser conversation history visibilityをご覧ください。

Identity VerificationとMessenger Security with JWTsの主な違い

Identity Verification

Messenger Security with JWTs

認証方法

HMAC-SHA256署名付きハッシュ

HMAC-SHA256署名付きJWTトークン

有効期限対応?

いいえ

はい

安全なデータ更新対応?

いいえ

はい

推奨用途

Messengerでの基本的な本人確認

より良いセッション制御と安全なデータ処理を伴う安全な認証


移行手順

ステップ1:ハッシュの代わりにJWTを生成するよう統合を更新する

  1. Identity Verification用のHMAC-SHA256署名(ユーザーハッシュとも呼ばれる)の生成を停止してください。

  2. [任意] Messenger用に新しいシークレットキーを生成し、適用するプラットフォームを選択してください。

ワークスペースで既にIdentity Verificationが有効(Messenger設定で「securely installed」と表示)な場合、Intercomは有効なユーザーハッシュか有効なJWTのいずれかを含むリクエストのみを受け入れます。
​
JWTの実装が期待通りに動作するか確認したい場合は、テストワークスペースで先に統合を行うことを推奨します。
​
​注意:テストワークスペースと本番ワークスペースはMessengerのシークレットキーが異なり、それぞれ異なるユーザーハッシュとJWTを生成します。

Node.js用のサンプルサーバーサイドコード設定例はこちらです。

const jwt = require("jsonwebtoken");

const payload = {
user_id: "USER_ID_HERE", // Required
email: "EMAIL_ADDRESS_HERE", // Optional
data_attribute: "YOUR_DATA", // Optional
exp: Math.floor(Date.now() / 1000) + 3600 // Expires in 1hr
};

const secret = process.env.MESSENGER_SECRET_KEY || "YOUR_MESSENGER_SECRET_KEY"; // Secure key storage

const intercomUserJwt = jwt.sign(payload, secret, { algorithm: "HS256" });

JWTペイロードに含める内容:

  • ユーザーを識別するためのuser_id。必須フィールドです。

  • 有効期限のための任意のタイムスタンプ(exp)

  • users向けに安全に送信したいその他のデータ属性

JWTの生成方法について詳しくはhelp centerのメイン記事またはセキュリティ設定をご覧ください。

ステップ1a:データ属性についての注意点

現在Messengerを通じてusersのデータ属性を送信している場合は、それらの属性をusersのJWT内で安全に送信するよう統合を更新してください。そのためには、ペイロードに属性を追加し、不安全なMessengerリクエストをブロックする必要があります。

上記のコード例では、ペイロードにuser_idとemailを署名しています。有効期限もペイロードに含めるべきです。

これらの属性については、不安全なMessenger更新を無効化すべきです。つまり、有効なJWTを介してのみ更新可能で、それ以外では更新できません。

JWTで送信している属性については、このトグルを有効にすることを推奨します。ワークスペースの属性は設定 > データ > Peopleで確認できます。

注意:この属性更新トグルは、botを使ったleadsからの直接データ収集を妨げるものではありません。このデータはusersから直接取得されます。

ステップ2:users向けにJWTを送信するようフロントエンドスニペットを更新する

IDV用のHMAC署名の代わりに、Messenger設定でJWTをintercom_user_jwtとして渡してください。

Web(JavaScript SDK)用:

window.Intercom("boot", {
api_base: "https://api-iam.intercom.io",
app_id: "<YOUR_APP_ID_HERE",
intercom_user_jwt: "<YOUR_USER_JWT_HERE>"
};

React: React SDKを使用している場合、上記のバニラJavaScriptスニペットのようにboot呼び出しでapi_baseは不要です。React SDKが内部で処理します。plain JavaScriptスニペットを使う場合のみapi_baseを含めてください。

前節で述べたように、データ属性は現在JWT内で送信しており、スニペットからは削除されています。

JWTの生成方法について詳しくはhelp centerのメイン記事またはセキュリティ設定をご覧ください。モバイル向けはiOSとAndroidの開発者ドキュメントをご参照ください。


すべてのリクエストでJWTを強制する

個別リクエストで有効なJWTを受け入れることは、すべてのリクエストでJWTを必須にすることとは別のステップです。今後すべてのMessengerリクエストで有効なJWTを必須にするには、設定 > Messenger > セキュリティでEnforce Messenger Securityをオンにする必要があります。このトグルがオンになるまでは、JWT認証はワークスペース全体で強制されずとも正常に機能します。

トラブルシューティング

JWTへの移行を支援するために、セキュリティ設定には詳細な失敗ログとトークンデバッガーツールがあります。

JWTsに移行後、なぜ403 Forbiddenエラーが発生するのですか?

JWTsを使ったMessenger Securityに移行後、JWTが有効でも403「Forbidden request」エラーが発生するのは、ワークスペースでMessenger API for webがオフになっている場合です。オフの間は、Messengerはログインしたusersをすべて拒否し、JWTのuser_idがcontactのexternal_idと一致していても匿名訪問者のみを受け入れます。

403エラーを解決するには、設定 > チャネル > Messenger > インストールを開き、For users with loginsを選択して、Web向けのEnable the Messenger API to continue installationトグルをオンにしてください。その後、JWTを使ってMessengerを再度起動してください。


よくある質問

移行しないとどうなりますか?

Identity Verificationは当面動作しますが、JWTsはより強力なセキュリティと制御を提供します。

JWTセッションを取り消すには?

短い有効期限(exp)を設定するか、署名キーをローテーションして古いトークンを無効化できます。

Identity VerificationとJWTsを両方使えますか?

プラットフォームでJWT認証が有効になると、Identity Verificationは不要になります。ただし、web、iOS、Androidは個別に設定されているため、JWTsとIdentity Verificationを独立して使用可能です。

こちらの回答で解決しましたか?