はじめに
Amazon Cognito は、ウェブおよびモバイルアプリの認証、承認、およびユーザー管理機能を提供します。ゼロから認証機能の実装するのは大変なので、実装の負担などを軽減できます。
今回の記事は、Cognito の IdP として、Azure AD を利用して、Hosted UI を利用する方法を紹介します。Azure AD は SAML を利用できるため、SAML を使った方法となります。SAML を利用できる他の IdP も、もちろん連携可能です。
前提条件と確認
Cognito UserPool の基本的な設定は完了している状態で進めていきます。
Azure AD との連携を進める際に、いくつかの値をメモっておくと便利です。後の手順で使っていきます。
User Pool ID
Cognito Domain
Azure AD の設定
まず、Azure AD の設定を進めていき、Cognito と SAML のやりとりを出来るようにします。Azure AD を開きます。
エンタープライズアプリケーションを選択します。
新しいアプリケーションを選択します。
独自のアプリケーションの作成を選びます。
適当な名前を入れて、作成を押します。
シングルサインオンのメニューから、SAML を選択します。
基本的な SAML 構成の個所で、編集を押します。
次のパラメータを入れて保存を押します。「前提条件と確認」で確認した Cognito UserPool ID や、Domain の値を使っていきます。
識別子
# フォーマット
urn:amazon:cognito:sp:UserPoolID
# 入れる値
urn:amazon:cognito:sp:ap-northeast-1_exksQ29lq
応答URL
# フォーマット
https://yourDomainPrefix.auth.yourRegion.amazoncognito.com/saml2/idpresponse
# 入れる値
https://sugi01-test.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse
設定が反映されます。
フェデレーションメタデータ XML をダウンロードします。
ユーザーの追加を押します。
Azure AD 上のユーザーを選択します。
追加完了です。
Cognito UserPool に IdP の追加
Cognito UserPool の画面を開き、Add identity provider を選択します。
Azure AD との連携に SAML を利用するため、SAML を選択します。
分かりやすい名前を入れて、Choose file を選び、Azure AD からダウンロードしてきた「フェデレーションメタデータ XML」をアップロードします。
SAML attribute に、次の文字列を選択して、Add identity provider を選びます。
http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
設定が追加されました。
Cognito で Hosted UI の設定
追加した Azure AD の設定を Hosted UI で利用するために設定変更をしていきます。App Integration を選択します。
事前に設定していた、App Client を選択します。
Edit を押します。
Allowed callback URLs には、元々持っているアプリケーション側で用意しているコールバックを受け取る URL を指定します。基本的には、アプリ側で独自実装する部分です。
Identity Provider の個所で、Azure AD を追加して、Save Changes を押します。
追加されています。
動作確認
ここまでで設定が完了しました。Cognito の Hosted UI と連携しているページから、Hosted UI を呼びだしてみましょう。
Hosted UI の画面を呼び出すには、次のように適切なパラメータを指定した Cognito Domain を指定します。
https://sugi01-test.auth.ap-northeast-1.amazoncognito.com/login?response_type=code&client_id=xxxxxxxxxxxxxxxx&redirect_uri=https://yourwebsite/cognito_callback/callback
Azure AD を選択します。
選択した User名をいれて、次へを押します。
パスワードを入れます。
用意している動作確認用 Web アプリケーションで、ログイン完了が確認できました。
今回の動作確認用 Web アプリケーションでは、Cognito から発行された ID Token などは、Cookie に保存しています。
ID Token などは、JSON Web Token となっており、人間が読みやすい形式にデコード可能です。
クリティカルな情報を扱っていない場合は、こういったサイトでデコードをしてみるといいでしょう。
実際のデコードした例です。秘密な情報は一部マスクをしています。ユーザーの認証元の Identity Provider に付けた任意の名前や、メールアドレスなどが確認できますね。JWT が改ざんされていないか確認したうえで、この情報を活用しながら認可を実装する方法もあると思います。
{
"at_hash": "_k1sneTM4Pij2BWd60qyyQ",
"sub": "618a7bf0-0653-47a9-82fe-cc0a7d0abe9e",
"cognito:groups": [
"ap-northeast-1_exksQ29lq_AzureAD",
"GeneralGroup"
],
"email_verified": false,
"cognito:preferred_role": "arn:aws:iam::xxxxxxxxxxxx:role/Cognito_IdentityPoolTestAuth_Role",
"iss": "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_exksQ29lq",
"cognito:username": "azuread_testuser01@yourgmail.onmicrosoft.com",
"nonce": "4qqibhEcSYhORT7BcszM3LjalVGYP9YhHITM30YXyAzmryQRHyP47uPRUUddWBwC1kGssesBuTnH7Au4PHlR09slq1MYcoHOjJ8Z5s_PUP1L95OpPP7WbYNNrgbcpt4bJ-AeeElg1EZQ9g9LCJ-cG2fYcJDfHyj9cUmGyWUtpac",
"origin_jti": "e2eaba2a-ddf7-4c81-8dd2-8f5116034fb4",
"cognito:roles": [
"arn:aws:iam::xxxxxxxxxxxx:role/Cognito_IdentityPoolTestAuth_Role"
],
"aud": "5v9cdqqgua1imohsovur3bt7e4",
"identities": [
{
"userId": "testuser01@yourgmail.onmicrosoft.com",
"providerName": "AzureAD",
"providerType": "SAML",
"issuer": "https://sts.windows.net/54d4fb23-4655-46de-ab3a-4698ab819886/",
"primary": "true",
"dateCreated": "1642941543991"
}
],
"token_use": "id",
"auth_time": 1642941545,
"exp": 1642945145,
"iat": 1642941545,
"jti": "1637b57b-6c5f-4bd7-a6d6-878c8ee2d474",
"email": "testuser01@test.com"
}
ログインで自動生成されるもの
Azure AD(SAML) を使って Cognito にログインしたときに、いくつか自動生成されるものがあります。
まず、グループです。Azure AD(SAML)で連携したことが自動的に判別されて、Group が作成されています。
つぎに、ユーザーです。Azure AD 上の名前などを基に、Cognito 上でユーザーが作成されます。
なお、このユーザーは自動的にグループに所属しています。
Azure AD に直接ログイン
Azure AD を使ったログインは、Hosted UI を経由する方法を動作確認で行いました。この方法でもいいのですが、Hosted UI 上のボタンのリンクを取得してくることで、これをそのまま直接ログインに利用できます。
Hosted UI 上で、どの IdP を利用するか選択する画面に移動します。
Chrome で Developer Tools を開いて、マウス選択が出来るボタンを押します。
Azure AD のログインボタンをマウスで重ねると、HTML タグを確認できます。ここにある href で指定されている URL をコピーしてきます。
半角スペースは「+」に変換しつつ、URL を整理します。一部マスクしていますが、こんな感じですね。
https://yourdomain.auth.ap-northeast-1.amazoncognito.com/oauth2/authorize?identity_provider=AzureAD&redirect_uri=https://secret/callback&response_type=CODE&client_id=secret&scope=aws.cognito.signin.user.admin+email+openid+phone+profile
この URL を HTML タグに埋め込むと、直接の Azure AD ログインへのリンクが生成できます。
参考URL
【AWS】Cognito ユーザプールをAzure ADをIdPとして構築する(後編)
https://qiita.com/kei1-dev/items/c8ae68e975dccb2902be