Amazon Cognito ユーザープールでAWS SSOをIdPとして設定する

AWSのIoT関連サービスはかなり充実してきており、ダッシュボードや管理画面などもたくさん提供されています。

* AWS IoT SiteWise Monitor
* Fleet Hub for AWS IoT Device Management
* Amazon Managed Grafana

などなど。
共通点として、ユーザー管理にAWS Single Sign-On (AWS SSO)が使われており、開発することなく、ユーザー管理ができますし、
同じIDで複数のサービスにログインすることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/4584f181-c601-ce8c-de19-44bdb731d8fd.png)

自前で作成するアプリケーションもこの仲間に入ることができないかと思い調べたところ、CognitoのSAML連携で実現できそうということがわかりましたので、試してみました。

完成したら、こんなことができるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5ac958e5-cc16-c628-c3fb-de7153fd2cf8.png)

# 参考

AWS Single Sign-Onではありませんが、他のOktaとSAML連携する資料がありましたので、これを参考にしました。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/cognito-okta-saml-identity-provider/

# Cognito ユーザープールを作成する

まずはウィザードに従ってユーザープールを作成します。

## ステップ1 サインインエクスペリエンスを設定

| 項目 | 値 |
| --- | --- |
| プロバイダーのタイプ | Cognito ユーザープール |

| 項目 | 値 |
| --- | --- |
| Cognito ユーザープールのサインインオプション | Eメール |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a1902ee7-e3d6-6db1-5f7b-60ab83cacee7.png)

## ステップ2 セキュリティ要件を設定

| 項目 | 値 |
| --- | --- |
| パスワードポリシーモード | Cognitoのデフォルト |

| 項目 | 値 |
| --- | --- |
| MFAの強制 | MFAなし |

| 項目 | 値 |
| --- | --- |
| セルフサービスのアカウントの復旧を有効化 | チェックなし |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/ae0d3571-1dc1-b749-9555-66729e124325.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/0435cd55-2489-6c1d-2dde-4eaeae23189f.png)

## ステップ3 サインアップエクスペリエンスを設定

| 項目 | 値 |
| --- | --- |
| 自己登録を有効化 | チェックなし |

| 項目 | 値 |
| --- | --- |
| Cognitoが検証と確認のためにメッセージを自動的に送信することを許可 | チェックなし |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5d16b071-92e7-5c64-da0a-b4021d67c35b.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/80374dbd-cdad-29c5-fdf2-15ba9ad51be9.png)

## ステップ4 メッセージ配信を設定

| 項目 | 値 |
| --- | --- |
| Eメールプロバイダー | CognitoでEメールを送信 |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/14f3807e-870a-b3fa-bedd-aa97e3cd4fb3.png)

## ステップ5 アプリケーションを統合

| 項目 | 値 |
| --- | --- |
| ユーザープール名 | UserPool001 |

| 項目 | 値 |
| --- | --- |
| CognitoのホストされたUIを使用 | チェックあり |

| 項目 | 値 |
| --- | --- |
| ドメインタイプ | Cognitoドメインを使用する |
| Cognitoドメイン | https://c4g2hykd |

| 項目 | 値 |
| --- | --- |
| アプリケーションタイプ | パブリッククライアント |
| アプリケーションクライアント名 | AppClient |
| クライアントのシークレット | クライアントのシークレットを生成しない |
| 許可されているコールバックURL | https://example.com |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/6daa24c5-22df-4312-42e7-fdaecf8784cf.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/08a9c8ad-adc4-0b64-cc20-ef18f357e358.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5aae426c-cd29-29d5-43f8-c90ba9ac79cc.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/9acfc978-27ef-3b24-7b37-b653fd19ba2e.png)

以上で、Cognito ユーザープールの作成は完了です。

# AWS SSOにアプリケーションを作成する

## 1. 新規アプリケーションの追加

「カスタム SAML 2.0 アプリケーションの追加」をクリック

![console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/aa908c0a-d3c3-30c5-e84f-b61ec03adc0d.png)

## 2. Custom SAML 2.0 application の設定

| 項目 | 値 |
| --- | --- |
| 表示名 | Custom SAML 2.0 application |
| 説明 | Custom SAML 2.0 application |

**AWS SSO SAML メタデータファイル**のURLは後で使います。

__メタデータファイルがない場合は、手動でメタデータ値を入力できます。__のリンクをクリックます。

| 項目 | 値 | 説明 |
| --- | --- | --- |
| アプリケーション ACS URL | https://c4g2hykd.auth.us-east-1.amazoncognito.com/saml2/idpresponse | [Cognitoドメイン]/saml2/idpresponse
| アプリケーション SAML 対象者 | urn:amazon:cognito:sp:us-east-1_lRTlSUVKh | urn:amazon:cognito:sp:[ユーザープール ID]

![console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3016c42e-b77b-7b67-9cc9-127d5da1ddbe.png)

![console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/97ea4d4a-8e52-1a2b-721d-02e168100c19.png)

![console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/45618abf-a338-cc11-e911-da3c20b39333.png)

## 3. 属性マッピング

属性マッピングタブで以下の通り設定します。

| アプリケーションのユーザー属性 | この文字列値または AWS SSO のユーザー属性にマッピング |
| --- | --- |
| http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress | ${user:email} |

![console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a96da2ff-bcc6-f8ac-9826-ce9f89ca5268.png)

## 4. 割り当て済みユーザー

作成するアプリに割りあてる、SSOのユーザーを追加します。

# Cognito ユーザープールのIdPとしてAWS SSOを追加する

サインインエクスペリエンスタブのアイデンティティプロバイダーを追加をクリックします。

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c15bb3ac-851b-bae4-184e-ff96359631ac.png)

## 1. アイデンティティプロバイダーを追加

| 項目 | 値 |
| --- | --- |
| フェデレーティッドサインインのオプション | SAML |

| 項目 | 値 |
| --- | --- |
| プロバイダー名 | AWSSSO |
| サインアフトフローを追加 | チェックあり |
| メタデータドキュメントのソース | メタデータドキュメントのエンドポイントURLを入力 |
| メタデータドキュメントのエンドポイントURLを入力 | https://portal.sso.us-east-1.amazonaws.com/saml/metadata/NzgxNzQ5MzcyMTc3X2lucy1jZjdhYTcwNWI1ZjJjZGFm |

* SAML プロバイダーとユーザープールの間で属性をマッピング

| ユーザープール属性 | SAML 属性 |
| --- | --- |
| email | http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress |

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/2c3ef131-b7ff-7a5e-9d80-2835eb6bf7ef.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7a646d41-8e9d-a8fb-e22d-3b04f2c0c672.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a5be58e2-713b-96cb-8b07-8595c1104422.png)

## 2. アプリケーションクライアントの設定を修正する

アプリケーションの統合タブの最下部にある **AppClient** をクリックします。

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7a3117ee-987c-73e0-eae0-4e53a028e7b3.png)

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8108693b-07a0-fb49-8691-24549cfc6fbe.png)

**ホストされた UI**の編集ボタンをクリックします。
以下の設定を変更します。

1. IDプロバイダーを**AWSSSO**に変更
2. OAuth 2.0 権限タイプを**暗黙的な付与**に変更

![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/aae4707e-a353-c62b-2106-9120f4ea7ca2.png)


![console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (26).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/fd4673cd-7d84-e1d7-ba36-07a78b46c34f.png)

以上で設定は完了です。

# 動作確認

**ホストされた UI**の欄にある「ホストされたUIを表示」ボタンをクリックします。

AWS SSOのログイン画面が表示されます。

![us-east-1.signin.aws_platform_login_workflowStateHandle=734e7303-1b7e-4cc3-b08b-302933efa5c7(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/e2def43d-3b00-02e5-cb25-b4a97a3753a5.png)

認証情報を入力し、ログインすると、最終的に https://example.com に遷移します。

![example.com_(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/dc9f87e1-a46e-24b7-4a81-541811e14785.png)

URLを見てみると、トークンが付与されていることがわかります。

```
https://example.com/#access_token=xxxxx&idToken=xxxxx&token_type=Bearer&expires_in=3600
```

このトークンを使用すれば、Cognitoで認証するように設定したAPI Gatewayなどにアクセスできるようになりますね。