こんにちは。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を設定してみました。