Suite | すべてのプラン |
会話型サポートを提供する場合、ユーザーは複数のデバイスやチャネルを切り替えながら会話を続けることがあります。エンドユーザーを認証することで、すべてのタッチポイントが同じエンドユーザーに確実に関連付けられます。これにより、エージェントが提供するサポートの質を向上させ、エージェントがサポートする際にエンドユーザーに提供を求める個人情報のセキュリティを高めることができます。
関連記事:メッセージングのユーザー認証について
メッセージングの認証に関する用語
- JWT:Zendeskでは、メッセージングのエンドユーザー認証に署名されたJSON Webトークン(JWT)を使用します。これらのトークンには、エンドユーザーの本人確認を行うための情報が含まれています。JWTの詳細については、jwt.ioを参照してください。
- 署名キー:Zendeskの管理者が管理センターで作成し、チーム内の開発者と共有します。開発者はこの署名キーを使用して、必要に応じてJWTに署名を行います。
- 外部ID:外部システムで使用されているIDなど、各ユーザーに一意の英数字から成る文字列。メールアドレスがJWTに含まれている場合でも、これはメッセージング認証における重要な識別子となります。
- ユーザー名:(オプション)外部IDまたはメールアドレスに関連付けられたエンドユーザーの名前。JWTに含めたユーザー名が、エージェントワークスペースに表示されます。ユーザー名の情報は、エージェントがエンドユーザーとコミュニケーションを取る際に役立ちます。
- メール:(オプション)エンドユーザーに関連付けられた一意のメールアドレス。
メッセージングのエンドユーザー認証の実装の概要
ZendeskはJSON Webトークン(JWT)を使用して、メッセージング相手のエンドユーザーを認証し、ステートレスかつ柔軟な方法でユーザーIDを検証してAPIエンドポイントを保護します。
- メッセージング認証のプロセスでは、まず管理者が署名キーを生成して開発者に提供します。次に、開発者は署名キーを使用してバックエンドサービスを実装し、要求に応じてユーザーの署名付きJWTを作成できるようにします。
- 要求されると、バックエンドサービスは署名付きJWTを作成し、Webサイトやモバイルアプリに返します。このサービスによって作成されるJWTには、エンドユーザーを識別するための一意の外部IDと、オプションでメールアドレスを含める必要があります。
- ユーザーがログインするたびに、Webサイトやアプリは、Web WidgetやモバイルSDKで利用可能な同等のログインAPIを呼び出す必要があります。その際にJWTがZendeskに渡され、ユーザーの本人確認が行われます。
開発者向けの詳しい情報については、「Enabling authenticated visitors for messaging with Zendesk SDKs」を参照するか、次のビデオをご覧ください。
Webメッセージングでのエンドユーザーの認証(17:22)
署名キーの作成と共有
署名キーは、開発者がエンドユーザー用にJWTを作成するために使用します。署名キーを作成するには、管理者であることが必要です。最大10個のキーを作成できます。上限の10個に達した後にさらにキーを作成しようとすると、未使用のキーを削除するように求められます。
- 管理センターで、サイドバーの「
アカウント」をクリックし、「セキュリティ」>「エンドユーザー認証」を選択します。
- 「メッセージング」タブをクリックし、「キーを作成」をクリックします。
初めてキーを作成する場合は、「キーを作成」がページの一番下に表示されます。一番下に表示されない場合は、右上に表示されます。
- キーの「名前」を入力し、「次へ」をクリックします。
- プロンプトが表示されたら、「コピー」をクリックして共有シークレットをコピーします。
キーが保存され、IDが自動的に割り当てられます。キーのIDは、「エンドユーザー認証」ページの「メッセージング」タブにあるキーのリストで確認できます。
- 誰にも知られないように、キーのIDとコピーした共有シークレットを開発者に渡します。
- 「キーを永久に非表示にする」をクリックします。
外部IDのみによるエンドユーザーの認証
エンドユーザーを認証するには、ユーザーに発行するJWTに外部IDを含める必要があります。ZendeskはJWTで提供される外部IDを、メッセージングにおけるユーザー認証の主要な識別子として使用します。ユーザー認証を行う際、Zendeskはまず外部IDに一致する既存のユーザーを解決します。外部IDに一致するユーザーが存在しない場合に限り、JWTにメールアドレスが含まれていれば、そのアドレスを使用してユーザーIDを解決します。
外部IDのみでJWTに署名する
- external_id:(必須)各ユーザーを識別するために使用できる一意の英数字文字列です。詳しくは「ユーザーに発行するJWTで使用する外部IDを選択する」を参照してください。
-
scope:(必須)呼び出し元のアクセスのスコープ。有効な値は
user
のみです。 - name:(オプション)ユーザーの名前。JWTペイロードに名前を含めることで、Zendeskがエージェントワークスペースにユーザーの名前を表示できるようになり、エージェントがよりカスタマイズされたサポートを提供できるようになります。
{
"external_id": "12345678",
"scope": "user",
"name": "Jane Soap"
}
ユーザーに発行するJWTで使用する外部IDを選択する
- 外部IDは英数字から成る文字列であること。
- 外部IDは最大255文字まで。
- 各ユーザーの外部IDが、アカウントレベルでグローバルに一意であること。
アカウントに複数のブランドがある場合、外部IDはすべてのブランドで一意でなければなりません。
- ユーザーの外部IDは決して変更してはならない。
- ユーザーに割り当てられる外部IDは1つだけ。
外部IDの適切な選択例としては、最初のコンタクト時に割り当てられるインクリメントIDまたはランダム化ID(例:usr_12345)、あるいは、複数のブランドについては、ブランド固有の識別子とインクリメンタルIDまたはランダム化IDを組み合わせたもの(例:brand1_a8dedg)などがあります。
ユーザーのメールアドレスと電話番号は、時間の経過とともに変更されることがあり、複数の値を持つ場合もあるため、使用は避けてください。また、ユーザー名も一意でない可能性があるので避けてください。
ユーザー認証へのメールIDの組み込み
- 認証済みユーザーは、署名されたJWTによって認証されます。
JWTを使用すると、署名されたJWTの内容がエンドユーザーによって改ざんされることはないため、信頼できる方法となります。なりすまし攻撃の懸念がある場合は、メールIDの使用を認証済みエンドユーザーのみに制限することをお勧めします。この方法は最も安全なオプションであり、Zendeskアカウントの新規作成時のデフォルト設定になっています。
- 未認証ユーザーとは、Zendeskボットのプロンプトに対してメールアドレスを提供するエンドユーザーです。
なお、未認証ユーザーにメールIDの使用を許可すると、自分のものでないメールアドレスを渡して他のユーザーになりすますおそれがあり、なりすまし攻撃に対してセキュリティが脆弱になる可能性があります。
以下のフローチャートに、メッセージング認証でメールIDをどのように使用できるかを示します。
メールIDを設定する
Web Widgetやモバイルアプリを利用する際、ユーザーはフォームやAIエージェントのプロンプトに応じてメールアドレスを提供できます。このようなシナリオでは、悪意のあるユーザーが他人のメールアドレスを提供してなりすますことを防ぐ仕組みがありません。しかし、外部IDとメールアドレスの両方でユーザーを認証するためにJWTを使用することは、単にユーザーにメールアドレスを割り当てるよりも信頼性の高い方法です。
設定によっては、エージェントはフォームから収集したメールアドレスとJWTから提供されたメールアドレスの両方をユーザープロフィールで見ることができます。新しいZendeskアカウントでは、メールアドレスが有効になっており、確認済みのメールアドレスのみを使用するように設定されています。これが最も安全なオプションです。古いアカウントでは、認証済みのメールアドレスと未認証のメールアドレスの両方を使用するように設定されています。
- 管理センターで、サイドバーの「
チャネル」をクリックし、「メッセージングとソーシャル」>「メッセージング」を選択します。
- 「設定を管理」をクリックします。
- 「メールID」をクリックし、次のオプションのいずれかを選択します。
- 確認済みメールのみを使用する:(デフォルト)メールIDは、発行されたJWTに確認済みのメールアドレスが含まれている、認証済みのユーザーに対してのみ作成されます。
- 確認済みメールと未確認メールの両方を使用する:認証されたユーザーのメールアドレスがユーザープロフィールに表示されることに加え、AIエージェントフローを通じてユーザーから提供された未確認のメールアドレスもユーザープロフィールに追加されます。
- (非推奨)未認証のユーザーであっても、メールアドレスを確認済みメールアドレスとして利用できるようにしたい場合は、「未認証のユーザーが確認済みメールアドレスの所有権を主張できる」を選択します。
- 「設定を保存」をクリックします。
確認済みメールのみを使用する
メールIDは、発行されたJWTに確認済みのメールアドレスが含まれている、認証済みのユーザーに対してのみ作成されます。
このオプションを使用すると、エージェントは未認証のエンドユーザーから提供されたメールアドレスを会話履歴で確認できますが、そのユーザーに紐づけられたメールIDを見ることはできません。未認証のユーザーをメールでフォローアップする必要がある場合、エージェントは、そのユーザーレコードにメールIDを手動で追加する必要があります。
確認済みメールと未確認メールの両方を使用する
認証されたユーザーのメールアドレスがユーザープロフィールに表示されることに加え、AIエージェントフローを通じてユーザーから提供された未確認のメールアドレスもユーザープロフィールに追加されます。
このオプションは、悪意のあるユーザーがまだなりすまし攻撃を試みる可能性があるため、セキュリティ面で劣ります。ただし、エージェントはユーザープロフィールを検査し、メールアドレスが確認済みかどうかを判断することができます。未確認のメールアドレスは、エージェントワークスペースで目立つように表示されます。エージェントが補足メールを送信する必要がある場合、エンドユーザーの身元の信頼性を高めるために、セキュリティ質問を使用して本人確認を行うよう指示できます。
イベントの順序 | イベント | 結果のメールID |
---|---|---|
1 | 認証されていないユーザーが、フォーム収集されたメールアドレスを提供する。例:alice@example.org | Zendeskは未認証の新規ユーザー(id:12345)を作成し、未確認のメールID(alice@example.org)を使用する。 |
2 | 認証されたユーザーには、以下のクレームを持つJWTが発行される。
|
Zendeskは未認証の新規ユーザー(id:22345)を作成し、確認済みのメールID(alice@example.org)を使用する。 確認済みのメールIDに置き換えられたため、未認証のユーザー(id:12345)は未確認のメールIDを失う。 |
未認証ユーザーが確認済みメールアドレスの所有権を主張できるようにする(非推奨)
他のメールIDオプションとは対照的に、この設定では、プロンプトが表示されたときにそのユーザーのメールアドレスを入力するだけで、ユーザーが確認済みユーザーのIDを引き継ぐことができます。このオプションを選択すると、確認済みのメールアドレスが未確認のメールアドレスに優先されなくなります。
この方法は安全性が最も低く、なりすまし攻撃を受けやすいオプションです。AIエージェント機能が一時停止しているときに、プロアクティブメッセージをAIエージェント用から人間のエージェント用に更新した場合、アカウントで自動解決が再び利用可能になったときに手動でメッセージを再開する必要があります。
このオプションを選択すると、メッセージングチャネルで収集されたメールIDの確認ステータスは信頼できなくなります。これは、ユーザー認証後に現れたなりすましによって、その後のメッセージングのやりとりでそのメールのステータスが乗っ取られる可能性があるためです。これはつまり、なりすまし攻撃が成功する可能性が高くなり、エージェントはエンドユーザーが本人であるかどうかを知る手段が限られます。しかし、確認済みのメールIDは未確認のメールIDよりも優先され、確認済みのメールIDはなりすましのユーザーレコードから削除されます。
メールアドレスを含むJWTを発行する
- external_id:(必須)各ユーザーを識別するために使用できる一意の英数字文字列です。詳しくは「ユーザーに発行するJWTで使用する外部IDを選択する」を参照してください。
-
scope:(必須)呼び出し元のアクセスのスコープ。有効な値は
user
のみです。 - name:(オプション)ユーザーの名前。JWTペイロードに名前を含めることで、Zendeskがエージェントワークスペースにユーザーの名前を表示できるようになり、エージェントがよりカスタマイズされたサポートを提供できるようになります。
-
email:(必須)サインインしているユーザーのメールアドレス。ユーザーに一意のものでなければなりません。
メールアドレスを、エージェントワークスペースのユーザーのメインのメールアドレスと照合するように設定します。セカンダリメールアドレスをJWTに含めることはサポートされていません。
-
email_verified:(オプション)当該エンドユーザーがメールアドレスのオーナーシップを証明したかどうか。エンドユーザーに確認済みメールIDを関連付けたい場合、発行するJWTに
email
と"email_verified": true
の両方のクレームを含める必要があります。
{
"external_id": "12345678",
"email": "janes@soap.com",
"email_verified": true,
"name": "Jane Soap",
"scope": "user"
}
JWTにおける外部IDとメールアドレスの競合の解決
Zendeskは外部IDをメインの識別子として使用し、メールアドレスは外部IDに一致するものが見つからない場合にのみ使用します。
メッセージング認証は、競合を回避できるよう考慮して実装するのが最善です。たとえば、外部IDとZendeskのメール設定が競合しないように選択します。ただし、JWTで提示されたメールアドレスがすでに別の外部IDに関連付けられている場合、ZendeskはそのJWTを拒否し、エンドユーザーのログイン試行は失敗します。この場合、ユーザーは未認証状態で会話が開始されます
- JWTを更新して、異なる
external_id
値またはemail
アドレスを使用します。または
- 競合する
external_id
を持つユーザーを削除し、別のエンドユーザーが使用できるように解放します。Sunshine Conversations APIの「Delete User」を参照してください。
167件のコメント
Thomas
Es posible aplicar la identificacion por Whatsapp?
0
DMIT Admin
zE('messenger', 'loginUser', function (callback) {
callback(token);
})
I get 401 authentication error, and I want to know how to catch this error. I use try/catch for callback(token), but it's not work.
Thanks
0
DMIT Admin
Hi,
I need guidance on managing the login between the web login and the Zendesk end-user messaging login to keep them both synchronized.
Typically, I set the web session and JWT token to expire at the same time. However, there may be additional scenarios as follows:
0
Perry IT-RD
How does the web side pass JWT? Is there a corresponding API?
0
Javier DM
En relación a tu consulta, la opción de "Talk" en el widget está presente en el Web Widget (Classic), y no en la Mensajería, solo para aclarar ese punto.
Para tener una funcionalidad similar, deberían utilizar el API de Talk: Voice API in messaging quick start
Ahora en cuanto a la pregunta en la autenticación, y si estás utilizando WW (Classic), al momento de solicitar un callback aparecerá el formulario para completar y no puede modificarse. Por lo que la información la tomará de allí. Y si se trata de un cliente llamando, esto sería una llamada entrante en Talk, por lo que no habría una relación entre la autenticación del Widget y una llamada en la que se tiene visibilidad únicamente del número de teléfono.
Si tuvieras alguna consulta adicional sobre este tema, te sugiero crear una conversación con el bot en nuestro Centro de ayuda para crear un ticket de soporte y poder evaluar mas en detalle.
Un saludo y que tengas excelente comienzo de semana.
0
Agente2
Hola, buenas, me gustaria saber si existe la posibilidad de cuando se configure la autenticacion de usuario para el web widget esto permite que se autentiquen tamb para llamada y no solamente para mensajeria.
Ejemplo: tengo un web widget configurado con mensajeria, chat y llamadas, si el usuario se autentica en el web widget, esta autenticacion me funciona para identificar quien me llama por la linea digital que tengo configurada?.
Si no es asi, podrian darme algunas alternativas, ya sean aplicaciones de terceros o quizas alguna idea respecto a esto.
Gracias y espero su respuesta.
2
Darlene Pinto Costa
Does anyone have an example of authentication with nextjs?
Today the use is script, ex
<script
id='ze-snippet'
src='https://static.zdassets.com/ekr/snippet.js?key=123456'
/>
0
Chris Batt
The last paragraph doesn't match what we're seeing in production, and seems to contradict itself:
So we expect that if we send the `external_id` and `email` in the JWT, and the `external_id` is not matched to a user, but the `email` is matched to a user, that user is authenticated. However, we observe some vastly different outcomes depending on whether we're testing in Sandbox vs. Prod, or whether the user has a verified or unverified email address, or whether we include `email_verified` in the JWT, but there is no scenario we've seen where a user is authenticated as an existing user when the `email` matches and when the `external_id` doesn't. We see instead, a new user is created, or the login request fails. The latter outcome seems to agree with the next sentence following the one above:
Which is essentially saying “if the external_ids don't match, but the emails do, we authenticate the user, except if the external ids don't match”. So my question would be under what circumstances exactly would the `email` be used to authenticate the user as a fallback when the external ids don't match?
* this was not the case in sandbox testing, where we never saw logins fail, and a new user was created each time, which was seriously confusing why sandbox would behave different than prod. The results were also different in that depending on the user's email verification status, the newly created user would inherit the email, and multiple results would be returned from the API search endpoint when querying on the email. This all made testing and implementation incredibly difficult.
4
Jakub
A autenticação do Centro de Ajuda e a autenticação do widget são dois fluxos diferentes.
Como não há outra maneira nativa de fazer isso no momento, o processo de autenticação JWT ainda precisa ser implementado como seria para qualquer site externo.
0
Mayara Sousa
Boa tarde.
Porquê o BOT não consegue identificar o usuário logado no GUIDE Zendesk e criar o ticket associado ao email desse usuário ?
1
サインインしてコメントを残します。