Amazon Cognito user poolの外部IdPとしてAzure ADを設定してみた
こんにちは、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
エラーが発生します。忘れずにアサインするようにしましょう。
以上