この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
Amazon Cognitoでは、user poolで管理しているユーザーだけでなく、SAML連携した外部のIdPで管理しているユーザーによるサインインを実装することも可能です。
今回は、Amazon Cognito user poolの外部IdPとしてMicrosoft Azure Active Directory(Azure AD)を設定してみました。
やってみた
こちらのドキュメントを参考にやっていきます。
(まだの場合)Cognito user poolおよびdomainの作成
下記エントリなどを参考に、Cognito user poolの作成およびCognito domainの設定を行っておきます。
この時、作成したCognito user poolの情報をもとに次の2つの値を作成しておきます。これらは次節で使用します。
- Identifier (Entity ID):
urn:amazon:cognito:sp:<userPoolID>
- Reply URL:
https://<domainPrefix>.auth.<aws-region>.amazoncognito.com/saml2/idpresponse
Azure ADへAmazon CognitoをEnterprise Applicationとして追加
Amazon Cognito user poolをAzure ADにアプリケーションとして追加することにより、両者の間の信頼関係を確立します。
AzureポータルでHome > Azure Active Directory > Enterprise applicationsで、[New application]をクリック。
[Create your own application]をクリック。
[What’s the name of your app?]でアプリ名を指定し、Integrate any other application you don’t find in the gallery (Non-gallery)
を選択して、[Create]をクリック。
アプリが追加され、追加されたアプリケーションのOverviewページにリダイレクトされます。[2. Set up single sign on]の[Get started]をクリック。
[Select a single sign-on method]よりSAML
を選択。
[Set up Single Sign-On with SAML]で[Basic SAML Configuration]の[Edit]をクリック。
[Basic SAML Configuration]ペインが開くので、前節で控えた[Identifier (Entity ID)]と[Reply URL]をそれぞれ指定します。[Save]をクリックして保存します。
続いて[Attributes & Claims]の[Edit]をクリック。
[Add a group claim]をクリック。
[Group Claims]ペインが開くので、[Which groups associated with the user should be returned in the claim?]でGroups assigned to the application
を選択し、[Save]をクリックして保存します。
追加されたClaimのClaim nameを控えます。[X]で[Attributes & Claims]を閉じます。
[Set up Single Sign-On with SAML]で[SAML Signing Certificate]の[App Federation Metadata Url]をコピーして控えます。
Amazon CognitoへAzure ADをSAML IdPとして追加
AWS CLIのadd-custom-attributes
コマンドを使用して、Cognito user poolに適当なカスタム属性を追加します。この属性はCognitoに登録されたSAML IdPがAzure ADからグループメンバーシップの詳細を受け取る用途で使用されます。
$ userPoolId=<ユーザープールID>
$ customAttributeName=attrForIdpRelation //適当なカスタム属性名
$ aws cognito-idp add-custom-attributes \
--user-pool-id ${userPoolId} \
--custom-attributes Name=${customAttributeName},AttributeDataType="String"
AWS CLIのcreate-identity-provider
コマンドを使用して、Cognito user poolにAzure ADをSAML IdPして追加します。
$ IDProviderName=AzureAD //適当なIdP名
$ metadataURLCopiedFromAzureAD=<前節で控えたApp Federation Metadata Url>
$ aws cognito-idp create-identity-provider \
--user-pool-id ${userPoolId} \
--provider-name=${IDProviderName} \
--provider-type SAML \
--provider-details MetadataURL=${metadataURLCopiedFromAzureAD} \
--attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress,${customAttributeName}=http://schemas.microsoft.com/ws/2008/06/identity/claims/groups
SAML IdPを使用するclient appをuser poolへ追加
Azure ADをSAML IdP使用するclient appをCognito user poolへ追加します。
$ appClientName=<適当なアプリクライアント名>
$ callbackURL=<コールバックURL>
$ aws cognito-idp create-user-pool-client \
--user-pool-id ${userPoolId} \
--client-name ${appClientName} \
--no-generate-secret \
--callback-urls "http://localhost:3000" ${callbackURL} \
--allowed-o-auth-flows code \
--allowed-o-auth-scopes openid email\
--supported-identity-providers ${IDProviderName} \
--allowed-o-auth-flows-user-pool-client
Azure ADアプリケーションへのユーザーのアサイン
Azure ADアプリケーションを使用してサインインをさせたいユーザーをアサインします。
AzureポータルでHome > Azure Active Directory > Enterprise applicationsで、作成したアプリケーションを選択して開きます。
[Assign users and groups]をクリック。
[Add user/group]をクリック。
[Add Assignment]-[Users]で[None Selected]をクリックし、アプリケーションを使用してサインインさせたいユーザーを一覧から選択し、[Select]をクリック。
[Assign]をクリック。
これでユーザーをアサインできました。
動作確認
AzureADによるSAML認証の動作確認をHosted UIのURLにアクセスして行ってみます。
Hosted UIはUserPool Clientのダッシュボードから開けますが、URLを手動作成することも可能です。
$ COGNITO_DOMAIN_NAME=<user pool domain作成時に指定したドメイン>
$ CLIENT_ID=<前節で作成したcliant appのID>
$ REDIRECT_URL=http%3A%2F%2Flocalhost%3A3000 //前節のclient app作成時に指定したコールバックURL
$ REGION=ap-northeast-1
$ ENDPOINT=${COGNITO_DOMAIN_NAME}.auth.${REGION}.amazoncognito.com/oauth2/authorize
$ echo "https://${ENDPOINT}?response_type=code&scope=email+openid&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URL}"
作成したHosted UIのURLにアクセスすると、Azure ADの認証画面が開きました。前節でアサインしたユーザーのIDを指定して次へ進みます。
パスワードを指定して次へ進みます。
するとcorporate IDでのサインインを求められるので、Cognito user poolに登録したIdP名(今回はAzureAD
)を選択します。
コールバックURLにリダイレクトされ、すでにlocalhost:3000
として起動してあったwebアプリにアクセスできました!
ハマったところ
AADSTS50105エラー
Azure ADアプリケーションにアサインしていないユーザーでサインインをしようとするとAADSTS50105
エラーが発生します。忘れずにアサインするようにしましょう。
以上