AWSのIoT関連サービスはかなり充実してきており、ダッシュボードや管理画面などもたくさん提供されています。
- AWS IoT SiteWise Monitor
- Fleet Hub for AWS IoT Device Management
- Amazon Managed Grafana
などなど。
共通点として、ユーザー管理にAWS Single Sign-On (AWS SSO)が使われており、開発することなく、ユーザー管理ができますし、
同じIDで複数のサービスにログインすることもできます。
自前で作成するアプリケーションもこの仲間に入ることができないかと思い調べたところ、CognitoのSAML連携で実現できそうということがわかりましたので、試してみました。
完成したら、こんなことができるはずです。
参考
AWS Single Sign-Onではありませんが、他のOktaとSAML連携する資料がありましたので、これを参考にしました。
Cognito ユーザープールを作成する
まずはウィザードに従ってユーザープールを作成します。
ステップ1 サインインエクスペリエンスを設定
| 項目 | 値 |
|---|---|
| プロバイダーのタイプ | Cognito ユーザープール |
| 項目 | 値 |
|---|---|
| Cognito ユーザープールのサインインオプション | Eメール |
ステップ2 セキュリティ要件を設定
| 項目 | 値 |
|---|---|
| パスワードポリシーモード | Cognitoのデフォルト |
| 項目 | 値 |
|---|---|
| MFAの強制 | MFAなし |
| 項目 | 値 |
|---|---|
| セルフサービスのアカウントの復旧を有効化 | チェックなし |
ステップ3 サインアップエクスペリエンスを設定
| 項目 | 値 |
|---|---|
| 自己登録を有効化 | チェックなし |
| 項目 | 値 |
|---|---|
| Cognitoが検証と確認のためにメッセージを自動的に送信することを許可 | チェックなし |
ステップ4 メッセージ配信を設定
| 項目 | 値 |
|---|---|
| Eメールプロバイダー | CognitoでEメールを送信 |
ステップ5 アプリケーションを統合
| 項目 | 値 |
|---|---|
| ユーザープール名 | UserPool001 |
| 項目 | 値 |
|---|---|
| CognitoのホストされたUIを使用 | チェックあり |
| 項目 | 値 |
|---|---|
| ドメインタイプ | Cognitoドメインを使用する |
| Cognitoドメイン | https://c4g2hykd |
| 項目 | 値 |
|---|---|
| アプリケーションタイプ | パブリッククライアント |
| アプリケーションクライアント名 | AppClient |
| クライアントのシークレット | クライアントのシークレットを生成しない |
| 許可されているコールバックURL | https://example.com |
以上で、Cognito ユーザープールの作成は完了です。
AWS SSOにアプリケーションを作成する
1. 新規アプリケーションの追加
「カスタム SAML 2.0 アプリケーションの追加」をクリック
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] |
3. 属性マッピング
属性マッピングタブで以下の通り設定します。
| アプリケーションのユーザー属性 | この文字列値または AWS SSO のユーザー属性にマッピング |
|---|---|
| http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress | ${user:email} |
4. 割り当て済みユーザー
作成するアプリに割りあてる、SSOのユーザーを追加します。
Cognito ユーザープールのIdPとしてAWS SSOを追加する
サインインエクスペリエンスタブのアイデンティティプロバイダーを追加をクリックします。
1. アイデンティティプロバイダーを追加
| 項目 | 値 |
|---|---|
| フェデレーティッドサインインのオプション | SAML |
| 項目 | 値 |
|---|---|
| プロバイダー名 | AWSSSO |
| サインアフトフローを追加 | チェックあり |
| メタデータドキュメントのソース | メタデータドキュメントのエンドポイントURLを入力 |
| メタデータドキュメントのエンドポイントURLを入力 | https://portal.sso.us-east-1.amazonaws.com/saml/metadata/NzgxNzQ5MzcyMTc3X2lucy1jZjdhYTcwNWI1ZjJjZGFm |
- SAML プロバイダーとユーザープールの間で属性をマッピング
| ユーザープール属性 | SAML 属性 |
|---|---|
| http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress |
2. アプリケーションクライアントの設定を修正する
アプリケーションの統合タブの最下部にある AppClient をクリックします。
ホストされた UIの編集ボタンをクリックします。
以下の設定を変更します。
- IDプロバイダーをAWSSSOに変更
- OAuth 2.0 権限タイプを暗黙的な付与に変更
以上で設定は完了です。
動作確認
ホストされた UIの欄にある「ホストされたUIを表示」ボタンをクリックします。
AWS SSOのログイン画面が表示されます。
認証情報を入力し、ログインすると、最終的に https://example.com に遷移します。
URLを見てみると、トークンが付与されていることがわかります。
https://example.com/#access_token=xxxxx&idToken=xxxxx&token_type=Bearer&expires_in=3600
このトークンを使用すれば、Cognitoで認証するように設定したAPI Gatewayなどにアクセスできるようになりますね。


























