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

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

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

image.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

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

項目
パスワードポリシーモードCognitoのデフォルト
項目
MFAの強制MFAなし
項目
セルフサービスのアカウントの復旧を有効化チェックなし

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (2).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (3).png

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

項目
自己登録を有効化チェックなし
項目
Cognitoが検証と確認のためにメッセージを自動的に送信することを許可チェックなし

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (4).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (5).png

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

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

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (7).png

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

項目
ユーザープール名UserPool001
項目
CognitoのホストされたUIを使用チェックあり
項目
ドメインタイプCognitoドメインを使用する
Cognitoドメインhttps://c4g2hykd
項目
アプリケーションタイプパブリッククライアント
アプリケーションクライアント名AppClient
クライアントのシークレットクライアントのシークレットを生成しない
許可されているコールバックURLhttps://example.com

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (8).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (9).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (10).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (11).png

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

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

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

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

console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720).png

2. Custom SAML 2.0 application の設定

項目
表示名Custom SAML 2.0 application
説明Custom SAML 2.0 application

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

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

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

console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (1).png

console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (2).png

console.aws.amazon.com_singlesignon_home_region=us-east-1(1280x720) (4).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

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

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

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

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

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720).png

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

項目
フェデレーティッドサインインのオプションSAML
項目
プロバイダー名AWSSSO
サインアフトフローを追加チェックあり
メタデータドキュメントのソースメタデータドキュメントのエンドポイントURLを入力
メタデータドキュメントのエンドポイントURLを入力https://portal.sso.us-east-1.amazonaws.com/saml/metadata/NzgxNzQ5MzcyMTc3X2lucy1jZjdhYTcwNWI1ZjJjZGFm
  • SAML プロバイダーとユーザープールの間で属性をマッピング
ユーザープール属性SAML 属性
emailhttp://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

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (16).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (17).png

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

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

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (22).png

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (23).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

console.aws.amazon.com_cognito_v2_idp_user-pools_create_region=us-east-1(1280x720) (26).png

以上で設定は完了です。

動作確認

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

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

us-east-1.signin.aws_platform_login_workflowStateHandle=734e7303-1b7e-4cc3-b08b-302933efa5c7(1280x720).png

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

example.com_(1280x720).png

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

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

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