こんにちは。AWS CLIが好きな福島です。
- はじめに
- 参考
- 構成イメージ
- やること
- ①Cognitoのユーザープール作成[AWS]
- ②ユーザープールへのドメイン追加[AWS]
- ③エンタープライズアプリケーションの作成[Azure]
- ④シングルサインオンの設定[Azure]
- ⑤ユーザーまたはグループの追加[Azure]
- ⑥Cognitoの外部IDP設定[AWS]
- ⑦アプリクライアントの作成[AWS]
- ⑧動作確認
- 終わりに
はじめに
今回は案件で利用しそうなため、Cognitoの外部IDPとしてAzure ADを設定してみました。
参考
構成イメージ
やること
- ①Cognitoのユーザープール作成[AWS]
- ②ユーザープールへのドメイン追加[AWS]
- ③エンタープライズアプリケーションの作成[Azure]
- ④シングルサインオンの設定[Azure]
- ⑤ユーザーまたはグループの追加[Azure]
- ⑥Cognitoの外部IDP設定[AWS]
- ⑦アプリクライアントの作成[AWS]
- ⑧動作確認
①Cognitoのユーザープール作成[AWS]
- ①-① 任意でユーザープール名を変数に追加します。
user_pool_name="" # ユーザープール名 ## 例 user_pool_name="test-user-pool"
- ①-② 以下のコマンドでユーザープールを作成します。
aws cognito-idp create-user-pool \ --pool-name ${user_pool_name}
- ①-③ この後、ユーザープールIDが必要になるため、変数に追加しておきます。
user_pool_id=$(aws cognito-idp list-user-pools \ --max-results 60 \ --query "UserPools[?Name=='${user_pool_name}'] | [0].Id" --output text)
②ユーザープールへのドメイン追加[AWS]
- ②-① 任意でユーザープールのドメイン名を変数に追加します。
cognito_domain="" # Cognitoのドメイン名 #例 cognito_domain="test-domain-20230323" #
※補足
ドメイン名は、<yourDomainPrefix>
に当たる名前を指します。
https://<yourDomainPrefix>.auth.<aws-region>.amazoncognito.com
- ②-② ユーザープールにドメイン名を付与します。
aws cognito-idp create-user-pool-domain \ --domain ${cognito_domain} \ --user-pool-id ${user_pool_id}
ドメイン名はグローバルで一意である必要があり、重複していた場合以下のエラーが出力されます。 エラーが出力された場合は、cognito_domainの値を変更してください。
An error occurred (InvalidParameterException) when calling the CreateUserPoolDomain operation: Domain already associated with another user pool.
- ②-③ 補足
以下のコマンドでユーザープールに設定したドメインの詳細を確認することができます。
aws cognito-idp describe-user-pool-domain --domain ${cognito_domain}
実行例
# aws cognito-idp describe-user-pool-domain --domain ${cognito_domain} { "DomainDescription": { "UserPoolId": "ap-northeast-1_YhCTYhKpq", "AWSAccountId": "xxxxxxxxxxxx", "Domain": "test-domain-20230323", "S3Bucket": "aws-cognito-prod-nrt-assets", "CloudFrontDistribution": "d3vhah7crmmd43.cloudfront.net", "Version": "20230323051242", "Status": "ACTIVE", "CustomDomainConfig": {} } } #
実際にユーザーのコンソールから確認することはできませんが、CloudFrontDistributionの項目があるため、 おそらく、内部的にCloudFrontが利用されているかと存じます。
- ②-④ この後必要になる識別子 (エンティティ ID)と応答 URL の情報を整理するため、以下のコマンドを実行します。
cat << EOF # 識別子 (エンティティ ID) urn:amazon:cognito:sp:${user_pool_id} # 応答 URL https://${cognito_domain}.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse EOF
出力例
# 識別子 (エンティティ ID) urn:amazon:cognito:sp:ap-northeast-1_YhCTYhKpq # 応答 URL https://test-domain-20230323.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
③エンタープライズアプリケーションの作成[Azure]
- ③-① Azure ADの画面から「エンタープライズアプリケーション」を押下します。
- ③-② 「新しいアプリケーション」を押下します。
- ③-③ 「独自のアプリケーションの作成」を押下します。
- ③-④ アプリ名を任意で設定(今回はcognito-app)し、「作成」を押下します。
④シングルサインオンの設定[Azure]
- ④-①「2。シングルサインオンの設定」を押下します。
- ④-② 「SAML」を押下します。
- ④-③「基本的なSAML構成」の「編集」を押下します。
- ④-④ 識別子 (エンティティ ID)と応答 URLを設定し、「保存」を押下します。
- ④-⑤ 「属性とクレーム」の「編集」を押下します。
- ④-⑥ 「グループ要求を追加する」を押下します。
- ④-⑦「アプリケーションに割り当てられているグループ」を選択し、「保存」を押下します。
- ④-⑧ この後利用するため、アプリのフェデレーションメタデータURLを控えておきます。
⑤ユーザーまたはグループの追加[Azure]
- ⑤-①「ユーザーまたはグループを追加」を押下します。
- ⑤-② 割り当てるユーザーを選択します。
- ⑤-③ 「割り当て」を押下します。
⑥Cognitoの外部IDP設定[AWS]
- ⑥-① 任意の属性名を変数に設定します。
custom_attributes="" #追加の属性名 例 custom_attributes=custom-attributes
- ⑥-② 属性を追加します。
aws cognito-idp add-custom-attributes \ --user-pool-id ${user_pool_id} \ --custom-attributes Name=${app_clinet_name},AttributeDataType="String"
- ⑥-③ プロバイダー名とメタデータURLを設定します。
provider_name="" # 任意のプロバイダー名 metadata_url="" # メタデータURL(④の一番最後にコピーしたURLを設定します。) #例 provider_name=azure-ad-provider metadata_url="https://login.microsoftonline.com/f15ccb0f-0c58-4690-b731-c3f4cb40e997/federationmetadata/2007-06/federationmetadata.xml?appid=47270d69-b46e-4178-a6b5-7e4774a29e94"
- ⑥-④ IDPの設定を行います。
aws cognito-idp create-identity-provider \ --user-pool-id ${user_pool_id} \ --provider-name=${provider_name} \ --provider-type SAML \ --provider-details MetadataURL=${metadata_url} \ --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress,${custom_attributes}=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
⑦アプリクライアントの作成[AWS]
- ⑦-① 任意でアプリクライアント名およびcallback URLを設定します。
app_client_name="" # callback_url="" # 例 app_client_name="test-app-client" callback_url="http://localhost"
- ⑦-② アプリクライアントを作成します。
aws cognito-idp create-user-pool-client \ --user-pool-id ${user_pool_id} \ --client-name ${app_client_name} \ --no-generate-secret \ --callback-urls ${callback_url} \ --allowed-o-auth-flows code \ --allowed-o-auth-scopes openid email \ --supported-identity-providers ${provider_name} \ --allowed-o-auth-flows-user-pool-client
⑧動作確認
- ⑧-① Cognitoのユーザープールの画面から作成したアプリケーションクライアントを押下します。
- ⑧-② ホストされたUIを表示を押下します。
- ⑧-③ Azureの認証画面が表示されるため、認証情報を入力します。
- ⑧-④ 認証が通ると、CallBackURLに指定したURLへアクセスできます。
※今回はlocalhostでWebサーバを構築していないため、ページがエラーになっていますが、URLがCallBackURLで指定したlocalhostに変わっていることが確認できます。
- 余談
余談ですが、一度ログインに成功したユーザーは、Cognitoのユーザー画面に表示されるようになります。
終わりに
今回は、案件で使うであろう、Cognitoの外部IDPとしてAzure ADを設定してみました。