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などにアクセスできるようになりますね。