Auth0でcybozu.comのSAML認証を行う

# はじめに
「Auth0を利用すると、SAML認証に対応したSPと簡単にSAML認証できそう」という思い付きと、「cybozu.comはSAML認証可能」ということを掛け合わしたところ、「出来た」ので、行った設定を残しておきたい。

CybozuのSAML認証といえば、[この記事](http://blog.cybozu.io/entry/4224)。
この記事を読んで、この手順をやってみて、改めてこの記事を読むと、SAML認証の理解が深まるかもしれない。

# 前提
- cybozu.comの開発者ライセンスが利用可能であること
- Auth0の検証可能なアカウントを持っていること

※Auth0については[Auth0に関する記事](http://qiita.com/tags/Auth0)などへ

# 手順概要
1. Auth0にクライアントを作る
2. Auth0にユーザーを作る
3. Cybozu.comにユーザーを作る
4. Auth0に作ったクライアントを設定する
5. Auth0からCybozu.comに信頼してもらうための情報を取得する
6. Cybozu.comにAuth0を信頼してもらう
7. Cybozu.comにアクセスしてSAML認証する

# 手順

以下、実際の手順。
はじめにAuth0とCybozu.comに管理者権限でログインしておくこと。

## 1. Auth0にクライアントを作る
### (1) Auth0 クライアント作成画面を開く
- Auth0のDashboardの左側のメニューで、[Clients]をクリックしてClients画面を開き、[+CREATE CLIENT]ボタンをクリックする。

### (2) クライアント作成
- Nameに任意のクライアント名を入力する。 例）Cybozu.com
- [Regular Web Applications]を選択する。
- [CREATE]ボタンをクリックする。

><img width="717" alt="Auth0 クライアント作成" src="https://qiita-image-store.s3.amazonaws.com/0/174697/21f1a009-f3c0-abde-5ea5-cf8209c42c33.png">

クライアントについては、一旦ここまでで次の手順へ。
（クライアントがないとDB Connectionが有効にできないようなので先に作成）

## 2. Auth0にユーザーを作る
Auth0にユーザーを作るにあたって、先にAuth0の内部データベース(DB CONNECTION)を作成する。
すでに利用可能なDB CONNECTIONが存在する場合や、他のConnectionを使う場合は省略しても良い。その場合は（4）へ。

### (1) Auth0 DB CONNECTION作成画面を開く
- Auth0のDashboardの左側のメニューで、[Connections]→[Database]とクリックしてDatabase管理画面を開き、[+CREATE DB CONNECTION]ボタンをクリックする。

><img width="1068" alt="Auth0 DB CONNECTION 作成トップ" src="https://qiita-image-store.s3.amazonaws.com/0/174697/31b45bea-b77e-ac95-4c26-949b38415307.png">

### (2) Database Connectionの作成
- Nameに任意のデータベース名を入力する。 例）"CybozuUserDB"
- Requires Username を有効にする。 （無効でも良い。有効の方がログインしやすいという理由のみ。）
- [CREATE]ボタンをクリックしてDB CONNECTIONを作る。

><img width="772" alt="Auth0 Database Connectionの作成" src="https://qiita-image-store.s3.amazonaws.com/0/174697/8bd36062-bc95-890c-b95e-f1256bddb742.png">

### (3) 利用するクライアント設定
- [Clients]をクリックし、クライアントを表示する。
- 先に作成したクライアントを、利用するクライアントとして設定する。

><img width="787" alt="Auth0 利用するクライアント設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/be0d4f1e-92b2-4cfd-f8a6-33946df4a085.png">

### (4) ユーザー作成画面を開く
- 左側のメニューで、[Users]をクリックしてユーザー管理画面を開き、[+ CREATE USER]ボタンをクリックする。

><img width="956" alt="Auth0 ユーザー作成画面トップ" src="https://qiita-image-store.s3.amazonaws.com/0/174697/87cd3da9-fc2e-9648-2f9a-6fe077a35ab6.png">

### (5) ユーザー作成
- Emailを含む全ての項目を入力し、Connectionに追加した DB Connectionを選択する。
- [SAVE]ボタンを押してユーザーを作成する。

><img width="551" alt="Auth0 ユーザー作成画面" src="https://qiita-image-store.s3.amazonaws.com/0/174697/38ce20f4-167f-ce64-2d80-1e4ca43227cc.png">

（後の認証は、ここで入力する Username と Password で行う。）

## 3. Cybozu.comにユーザーを作る
続いて Cybozu.com にユーザーを作成するが、それに当たって Cybozu.com のユーザーと Auth0 のユーザーを紐付ける情報が必要になる。
結論を先に書くと、Auth0のユーザーの user_id を、Cybozu.comのユーザーのログイン名として設定する。

### (1) Auth0で user_id を確認
- User Details 画面（ユーザーを作成後に表示された画面）を下にスクロールし、Identity Provider Attributesの user_id の値（以下の黒塗り部分を含む全て）をコピーする。

><img width="447" alt="Auth0 user_id 確認" src="https://qiita-image-store.s3.amazonaws.com/0/174697/d5e354d6-b67c-47e4-8275-fc88746f0266.png">

(Auth0にユーザーを作らずに他のConnectionの既存ユーザーを利用する場合でも、同様にuser_idをCybozu.comのログイン名にすれば良い)

### (2) Cybozu.com [組織/ユーザー]設定を開く
- Cybozu.com の共通管理を開き、左側のメニューの[組織/ユーザー]をクリックする。

><img width="209" alt="Cybozu.com メニュー 組織/ユーザー" src="https://qiita-image-store.s3.amazonaws.com/0/174697/1a232ed6-8475-f122-8040-72e2a222d375.png">

### (3) ユーザーの追加
- [ユーザーの追加]ボタンをクリックする。

><img width="367" alt="Cybozu.com ユーザーの追加" src="https://qiita-image-store.s3.amazonaws.com/0/174697/d39ea1b6-c421-f183-5f79-cbaf084c6505.png">

### (4) ユーザー情報を入力し保存
- [表示名]に任意の名称を入力する。
- [ログイン名]に、コピーした[user_id]を入力する。
- [保存]ボタンを押す。

><img width="413" alt="Cybozu.com ユーザー情報入力" src="https://qiita-image-store.s3.amazonaws.com/0/174697/7fb8b087-70ac-e76a-ee56-ff40d47496f8.png">

- パスワードの設定は[自動生成する]のまま[設定]ボタンを押す。

><img width="500" alt="Cybozu.com ユーザーの追加 パスワード設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/72f4fe56-a613-363c-7157-28f2511d6701.png">

## 4. Auth0に作ったクライアントを設定する
### (1) Auth0のクライアント設定画面を開く
- Auth0の左側のメニューの[Clients]をクリックし、先に作成したクライアントの設定アイコンをクリックして設定画面を開く。

><img width="952" alt="Auth0 クライアント設定画面トップ" src="https://qiita-image-store.s3.amazonaws.com/0/174697/7826bb8e-97e3-0f21-a91a-b46f742e6f7d.png">

### (2) Allowed Callback URLsを入力
- 入力するURLは「https://(sub_domain).cybozu.com/saml/acs」で、(sub_domain)は開発者ライセンスに割り当てられたサブドメイン。

><img width="559" alt="Auth0 Allowed Callback URLs" src="https://qiita-image-store.s3.amazonaws.com/0/174697/faf74829-405c-1a4f-3b0f-07517e07dc56.png">
([Token Endpoint Authentication Method]はPostでOK)

### (3) 一度保存
- [SAVE CHANGES]ボタンを押して一度保存する。

><img width="534" alt="Auth0 クライアント設定 設定保存" src="https://qiita-image-store.s3.amazonaws.com/0/174697/e1edbda6-a902-0e68-349a-a538aab80350.png">

### (4) アドオンを設定
- 画面上部の[Addons]をクリックし、アドオン設定画面を開く。

><img width="342" alt="Auth0 クライアント設定 アドオン設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/79f43239-20d4-dcc1-aa03-83a073742faf.png">

- [SAML2]をクリックする。

><img width="262" alt="Auth0 SAML2アドオン設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/eb46bb5e-4c33-727b-5381-78fde727d074.png">

- [Application Callback URL]に、前述の「https://(sub_domain).cybozu.com/saml/acs」と同じURLを入力する。

><img width="578" alt="Auth0 Application Callback URL設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/c93f00f4-4cff-e801-193d-e21bbf4ae26c.png">

- 画面下部の[SAVE]ボタンを押して一度保存する。

### (5) 動作確認
- 画面中部の[DEBUG]ボタンを押して動作確認を行う。

><img width="287" alt="Auth0 SAMLデバッグ" src="https://qiita-image-store.s3.amazonaws.com/0/174697/4500588a-6c33-c11d-62b3-173abfe248dc.png">

- ブラウザの新規タブでログイン画面が表示されるため、Auth0に作成したユーザーの Username と Password を入力して、[LOG IN>]ボタンを押す。

><img width="295" alt="Auth0 ログイン画面" src="https://qiita-image-store.s3.amazonaws.com/0/174697/259996cd-6b71-51f2-dfe6-fc03f980075f.png">

- 正常に動作していることを確認する。

><img width="171" alt="Auth0 ログイン成功" src="https://qiita-image-store.s3.amazonaws.com/0/174697/3ed92675-496b-ff7a-71ca-a5f1abc3c7dd.png">

## 5. Auth0からCybozu.comに信頼してもらうための情報を取得する

### (1) クライアント設定の詳細を表示
- [Settings]をクリックして、再度クライアントの設定画面を開く。

><img width="328" alt="Auth0 クライアント設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/174697/9dc0af5a-ada0-5d7c-80b0-472f5abe4d1a.png">

- 画面下部の[Show Advanced Settings]をクリックして詳細を表示する。

><img width="186" alt="Auth0 クライアント設定画面 詳細" src="https://qiita-image-store.s3.amazonaws.com/0/174697/fbc3a7cd-ab81-1a30-3fcf-1c68c00b6f2e.png">

- 詳細エリアの[Certificates]をクリックする。

><img width="734" alt="Auth0 クライアント設定画面 証明書" src="https://qiita-image-store.s3.amazonaws.com/0/174697/feab9551-ee27-3192-8a8c-f1d9752684c8.png">

### (2) 証明書をダウンロード
- [DOWNLOAD CERTIFICATE]をクリックする。

><img width="343" alt="Auth0 クライアント 証明書DL" src="https://qiita-image-store.s3.amazonaws.com/0/174697/23e23b25-3b19-3fb7-2e69-a6d08d378d6b.png">

- [CER]をクリックし、〜.cerファイルをダウンロードする。
(後ほどCybozu.comにアップロードする)

### (3) エンドポイントURLを確認
- [Endpoints]をクリックする。

><img width="731" alt="Auth0 クライアント エンドポイント設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/11ccdab8-0080-89d8-3596-cec77d683076.png">

- [SAML Protocol URL]の右のアイコンをクリックし、URLをクリップボードにコピーする。

><img width="537" alt="Auth0 クライアント エンドポイントURL" src="https://qiita-image-store.s3.amazonaws.com/0/174697/7484fd63-d3a9-4da3-5b07-9f96c3ed663d.png">

## 6. Cybozu.comにAuth0を信頼してもらう

### (1) Cybozu.com共通管理→システム管理→[ログイン]設定を開く
- Cybozu.comの共通管理のメニューのシステム管理→[ログイン]をクリックする。

><img width="212" alt="Cybozu.com 管理メニュー ログイン設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/f9b80ef2-8829-8cbf-6f45-6cf57b2d725a.png">

### (2) SAML認証の設定
- まず、[SAML認証を有効にする]のチェックボックスをオンにする。
- 続いて、[Identity ProviderのSSOエンドポイントURL]に、クリップボードにコピーしたURLを貼り付ける。
- [cybozu.comからのログアウト後に遷移するURL]を入力する。
- 次に、[参照]ボタンを押して、Auth0からダウンロードした証明書をアップロードする。
- 最後に[保存]ボタンを押して設定を保存する。

><img width="659" alt="Cybozu.com SAML認証設定" src="https://qiita-image-store.s3.amazonaws.com/0/174697/b31b2a27-7785-457c-44c0-838b577f3102.png">

（画面は一度SAML設定済みのものであるため、新規に設定する場合と多少異なる）

## 7. Cybozu.comにアクセスして認証する

- 「https://(sub_domain).cybozu.com/」を開く
- Auth0にリダイレクトされ、認証画面が開くので、Autu0で作成したユーザーの　Username、Passwordを入力してログインする。

><img width="314" alt="Auth0 ログイン画面" src="https://qiita-image-store.s3.amazonaws.com/0/174697/12fd4e05-986a-4023-b0e5-6959c57821f8.png">

- 認証が成功すると、Cybozu.comにリダイレクトされ、ログイン後画面が表示される。


# 補足

- 認証時にエラーになる場合、[SAML認証のトラブルシューティング](https://help.cybozu.com/ja/general/admin/saml_errors.html)を参照

- Cybozu.comでSAML認証が有効な場合でも、以下のURLで直接認証が可能
https://(sub_domain).cybozu.com/login?saml=off