複数ブランドを使用すると、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();
}
}
?>
セキュリティ設定の更新
- 管理センターで、サイドバーの「アカウント」をクリックし、「セキュリティ」>「シングルサインオン」を選択します。
- 「SSO設定を作成する」をクリックし、「トークン」を選択します。
- 一意の構成名を入力します。
- 「リモートログインURL」に、ログインスクリプトのURLを入力します。
- 「リモートログアウトURL」に、ログアウトスクリプトのURLを入力します。
- 同じメールアドレスで複数のユーザー認証システムにアカウントを持つカスタマーがいる場合、競合を避けるために、「外部IDを更新しますか?」をオンに設定します。
- ITチームに共有シークレットを提供します。チームがJWTを実装する際に必要になります。
- 変更を保存します。
重要な検討事項
- スクリプトをそのまま使用すると、セキュリティリスクは低くなります。ここで説明した変更以外にスクリプトを大幅に変更すると、自社のサーバー(Zendeskではなく)にセキュリティ上の脆弱性が生じる可能性があります。
- JWTトークンは1つしか提供されないため、すべてのSSOスクリプトは各種認証システムで同じトークンを使用します。1つでもシステムが侵害されると、すべてのブランドが侵害される可能性があります。
- 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"]);
}