複数ブランドを使用すると、1つのZendesk Supportインスタンスで自社のすべてのブランドを管理できますが、セキュリティ設定では、リモートログイン用に1つのURLしか設定できません。このため、ブランドごとにユーザーデータベースを構築している場合に問題が生じる可能性があります。
でも、心配はいりません。この記事で紹介する方法に従えば、Zendesk SupportとサーバーのSSOログインスクリプトの間に簡単なスクリプトを作成することで、カスタマーがログインしようとしているブランドに基づいて特定のURLへルーティングすることができます。
この方法は、サーバーでJWTが既に設定されていることを前提としています。設定していない場合は、「JWT(JSON Webトークン)を使用したシングルサインオンの設定」の記事に記載されている指示に従ってJWTを設定してください。
この例ではphpを使用していますが、必要に応じて他のプログラム言語にも適用することができます。
この記事では、次のトピックについて説明します。
複数ブランドの設定
この記事の内容を理解するには、少なくとも2つのブランドを設定する必要があります。 詳しくは、「複数のブランドを設定する方法(ProfessionalアドオンおよびEnterprise)」を参照してください。
ブランドを設定したら、ブランドのURLおよびホストマッピングしたブランドのURLを保存します。これらのURLは後でスクリプトで使用します。
JWTを設定した複数のユーザー認証システム
前述したように、ユーザー認証システムでJWT SSOを設定して構成する必要があります。これまでどおりブランドごとに1つずつ実行できますが、セキュリティオプションから取得する共有シークレットはすべての認証システムで同じでなければならないことに注意してください。
前のセクションの情報といっしょにログインURLおよびログアウトURLを保存します。
スクリプト
これからが楽しい作業になります。保存したたURLのリストは次のようになります。
ブランド1
ホストマッピングしていないURL:https://brand1.zendesk.com
ホストマッピングしたURL:https://support1.example.com
ブランド2
ホストマッピングしていないURL:https://brand2.zendesk.com
ホストマッピングしたURL:https://support2.example.com
システム1
ログインURL:https://page1.example.com/zdlogin.php
ログアウトURL:https://page1.example.com/zdlogout.php
システム2
ログインURL:https://page2.example.com/zdlogin.php
ログアウトURL:https://page2.example.com/zdlogout.php
では、スクリプトを作成してみましょう。各ブランドのURLから「https://」の部分を削除します。Webサイトのリンクはそのままにしておきます。
ログインスクリプト
<? $brand_URLs = array( "brand1.zendesk.com" => "https://page1.example.com/yourcustomloginjwtscript.php", "support1.example.com" => "https://page1.example.com/yourcustomloginjwtscript.php", "brand2.zendesk.com" => "https://page2.example.com/yourcustomloginjwtscript2.php", "support2.example.com" => "https://page2.example.com/yourcustomloginjwtscript2.php" ); foreach($brand_URLs as $k => $v){ if(strpos($_GET['return_to'],$k)){ header("Location: ". $v); die(); } } ?>
ログアウトスクリプト
<? $brand_URLs = array( "brand1.zendesk.com" => "https://page1.example.com/yourcustomlogoutjwtscript.php", "support1.example.com" => "https://page1.example.com/yourcustomlogoutjwtscript.php", "brand2.zendesk.com" => "https://page2.example.com/yourcustomlogoutjwtscript.php", "support2.example.com" => "https://page2.example.com/yourcustomlogoutjwtscript.php" ); foreach($brand_URLs as $k => $v){ if(strpos($_GET['return_to'],$k)){ header("Location: ". $v); die(); } } ?>
セキュリティ設定の更新
-
管理センターで、サイドバーにあるアカウントアイコン(
)をクリックし、「セキュリティ」>「シングルサインオン」を選択します。
- JSON Webトークンについて「有効」をクリックし、作成したスクリプトをポイントします(以下の例を参照)。
- 変更を保存します。
- リモートログインURL:ログインスクリプトへのURLである必要があります。
- リモートログアウト:ログアウトスクリプトへのURLである必要があります。
- 外部IDを更新しますか?:カスタマーの一部が同じメールアドレスで複数のユーザー認証システムにアカウントを作成している場合、ログイン時の競合を避けるために、このオプションで「オン」を選択する必要があります。
これで、エージェントまたは顧客は、アクセスしようとしているブランドに応じて、特定の認証システムを使用して認証できるようになります。
スクリプトは次の場所にもあります。
注1:スクリプトをそのまま使用すると、セキュリティリスクは低くなります。ここで説明した変更以外にスクリプトを大幅に変更すると、自社のサーバー(Zendeskではなく)にセキュリティ上の脆弱性が生じる可能性があります。
注2:JWTトークンは1つしか提供されないため、すべてのSSOスクリプトは各種認証システムで同じトークンを使用します。1つでもシステムが侵害されると、すべてのブランドが侵害される可能性があります。
注3:SSOを行おうとしたときに「JWTリクエストが無効です」というエラーが出た場合は、後述のトラブルシューティングの説明を参照してください。
トラブルシューティング
無効なJWTリクエストエラーを防ぐには、両方のブランドでhttps://(defaultsubdomain).zendesk.com/を/access/jwt?jwt=
としてハードコーディングしてください。ここで、(defaultsubdomain)はメインブランドのサブドメインです。たとえば、「mydomain.zendesk.com」のように入力します。
- SSOスクリプトに https://(defaultsubdomain).zendesk.comをハードコーディングすると、JWTペイロードは常に https://(defaultsubdomain).zendesk.com/access/jwtに送信されます。
- このスニペットをスクリプトに実装して'return_to'を使用し、エンドユーザーが元のヘルプセンターにリダイレクトされるようにします。両方のブランドマーキングURLのペイロードを'(defaultsubdomain)'として追加し、'return_to'を追加するようにします。
参考までに、スニペットは次のようになります。
if(isset($_GET["return_to"])) {
$location .= "&return_to=" . urlencode($_GET["return_to"]);
}
2 コメント
本件のスクリプトファイルの保存場所について、ZENDESKの推奨はあるのでしょうか?
ご質問の投稿ありがとうございます。
該当の件ですが、特に推奨はございませんので利用者がアクセスできるサーバーに当該のスクリプトが動作するページを作成いただければと思います。
ご確認よろしくお願いいたします。
サインインしてコメントを残してください。