概要
Amazon Cognito User Poolsで認証認可を行うアプリケーションからZendeskへSSOをする場合を考えてみます。
自分たちのwebサービス用のダッシュボードからサポートやヘルプデスクはZendeskに投げてしまいたいというケースは結構あると思うのですが、そういったユースケースに使えると思います。
構成
構成はAPI Gateway + Lambdaの構成で考えます。
まず、前段のAPI認証では、API GatewayのCustom Authorizerの機能を使います。詳細はAmazon API Gateway の Custom Authorizerを使い、User PoolsのユーザでAPI認証を行うにあります。
API認証を通過して認可を受ければ、SSO用LambdaファンクションでZendeskへのSSOを実施します。
Zendeskの設定
JWT(JSON Webトークン)を使用したシングルサインオンの設定
今回はこちらを使用してSSOを実装します。

SSO Lambda function
'use strict';
var jwt = require('jwt-simple');
var uuid = require('node-uuid');
var subdomain = '<Zendeskのサブドメイン>';
var shared_key = '<Zendeskの共有シークレット>';
module.exports.handler = function(event, context) {
var payload = {
iat: (new Date().getTime() / 1000),
jti: uuid.v4(),
name: event.email,
email: event.email
};
var token = jwt.encode(payload, shared_key);
var sso_endpoint = 'https://' + subdomain + '.zendesk.com/access/jwt?jwt=' + token;
context.succeed(sso_endpoint);
};
SSO用のエンドポイントを返却します。後はクライアント側でlocation.href = JSON.parse(sso_endpoint);
とかやってあげるとZendeskにシングルサインオン実施されます。
実践
1. User Poolsを使ったアプリケーションにログインします。

2. horike@digitalcube.jpでログインを行えました。そしてサポートのボタンをクリックします。

3. SSOが走ってZendeskへリダイレクトされます。Zendeskで側を確認すると自動でhorike@digitalcube.jpというユーザが作られているのがわかります。
