Cognitoの外部IDPとしてAzure ADを設定してみた

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は案件で利用しそうなため、Cognitoの外部IDPとしてAzure ADを設定してみました。

参考

https://aws.amazon.com/jp/blogs/security/how-to-set-up-amazon-cognito-for-federated-authentication-using-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を設定してみました。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。