Amazon CognitoとMicrosoft Entra IDをOIDCで連携する
はじめに
Amazon Cognitoを使って作ったWebアプリケーションなどにMicrosoft Entra IDでSSOしたいというケースを想定しています。
もう少し具体的に例を挙げると、
- toB向けSaaSアプリケーションとして「todo app」を構築している
- 既にユーザー管理にAmazon Cognitoを利用している
- Googleアカウントでのサインアップを許可している
上記の状況で、
- A社からSSOで「todo app」を利用したいと要望があった
- SSOにはA社の管理しているMicrosoft Entra IDを利用したい
といった場合です。
図で表すと、以下のような設計です。

接続方式の検討
Amazon Cognitoのユーザープールに対して、Microsoft Entra IDからSSOしたい場合、「ソーシャルプロバイダーと外部プロバイダー」というメニューから、アイデンティティプロバイダーを追加する必要があります。以下はマネージメントコンソールから見れるUIのスクリーンショットですが、Microsoft Entra IDは選択肢になく、必然的に「SAML」か「OpenID Connect (OIDC)」から選ぶことになります。

SAML vs OIDC
SAMLとOIDCの技術的な比較は他に任せるとして、判断の基準になるであろうものを2つあげます。
-
Microsoft Learn
SAMLかOIDCかを選択するためのフローチャートがあります。
新規でアプリケーションを作る場合、OIDCが推奨されています。
引用元 https://learn.microsoft.com/ja-jp/entra/identity/enterprise-apps/plan-sso-deployment
-
クライアントシークレットのローテーション運用
OIDCでは、Cognitoに登録するクライアントシークレットをEntra IDで発行する必要があります。このクライアントシークレットの有効期限は最長で2年になるため、それより短い期間でのローテーションが運用として発生します。対してSAMLの設定は一度きりなので、運用は発生しません。
**Microsoft Learnのチャートに従って、OIDCに対応していればOIDCを採用するのがいいでしょう。**しかしEntra IDでSSOする場合はSAMLを利用する記事が多く、OIDCの場合の記事が少ないように思いましたので、この記事を書いています。
OpenIDConnect
Microsoft Entra IDの設定
Amazon Cognitoの設定に必要な項目は以下の2つです。Microsoft Entraの設定では、この2つを取得することを念頭において進めていきましょう。
- クライアントID
- クライアントシークレット
-
Microsoft Azureにログインして、Microsoft Entra IDからアプリ登録を行います。
- リダイレクトURIには
https://<< あなたのユーザープールID >>.auth.<< あなたのユーザープールを配置したリージョン >>.amazoncognito.com/oauth2/idpresponseの形式で入力してください。 - 例:
https://ap-northeast-1a1b2c3d4e.auth.ap-northeast-1.amazoncognito.com/oauth2/idpresponse - この時点で「概要」からクライアントIDを確認できます。
- リダイレクトURIには
-
「証明書とシークレット」からクライアントシークレットを作成します。前述の通りこのクライアントシークレットには有効期限があります。推奨は6ヶ月です。作成したら表示される「値」(シークレットIDではないので注意)がクライアントシークレットです。
-
「APIのアクセス許可」を設定します。Cognito側でEntra IDから連携されたメールアドレスが必要なければ、もともと設定されているものは削除して、openidのみ追加します。メールアドレスが必要であれば、emailも追加してください。ただしこのメールアドレスは、ユーザーのサインアップ時にのみCognitoに連携され、以降サインイン時には連携されるものではありません。つまり初回登録以降にEntra IDでメールアドレスを変更しても、Cognitoには反映されないので注意してください。そのことについては https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference にも記載されています。
-
構成されたアクセス許可の設定

-
設定された後の画面

-
-
A社のユーザーが「todo app」にサインインするときに表示される同意画面をスキップさせるために、「<<ディレクトリ名>>に管理者の同意を与えます」というボタンをクリックしてあらかじめ同意を与えておきます。同意画面とは以下のような画面です。

-
他の項目は特に設定する必要はありません。パブリッククライアントフローは不要です。チェックしないでください。EntraにとってCognitoはWebアプリケーション(SPAではない)のように見立てられます。Entra IDとCognitoの連携はバックチャネルで行われます。トークン構成も不要です。

Amazon Cognitoの設定
-
アイデンティティプロバイダーを作成します。
- クライアントID: Entra IDの設定で取得したクライアントID
- クライアントシークレット: Entra IDの設定で取得したクライアントシークレット
- 許可されたスコープ: Entra IDの設定で許可したスコープ、つまりEntra IDで設定したAPIのアクセス許可(構成されたアクセス許可の設定)。今回の設定であれば
openid。 - OIDCエンドポイントの発行者URL: Entra IDの「概要」を開いて、上の方に表示されている「エンドポイント」ボタンを押すと出てくるエンドポイントの一覧から、機関 URL (この組織ディレクトリ内のアカウントのみ)を取得し、その最後に
/v2.0をつけたもの 例)https://login.microsoftonline.com/d0d4d33b-37b6-496a-8a03-d3ecd269b77e/v2.0 - マッピング: emailが欲しければemailとemailをマッピングする。その場合、許可されたスコープが
openid emailのようになっていること。Entra IDの設定でも構成されたアクセス許可の設定がopenid emailのようになっていること。
-
マネージドログインを使っている場合は、アプリケーションクライアントの設定からログインページの設定でIDプロバイダーに今回作成したアイデンティティプロバイダーを追加してください。
フロントエンドの設定
念の為react-oidc-contextの設定を記載しておきます。
読み飛ばしていただいて構いません。
-
authority:
https://cognito-idp.<< あなたのリージョン >>.amazonaws.com/<< あなたのユーザープールID >>
例)https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_AaBbCcDd9 -
scope: フロントエンドが必要な情報。つまりEntra IDとCognitoを連携する際にemailをスコープに含めていたとしてもフロントエンドでemailを必要としないのであればopenidのみでOK。ここで設定するscopeはあくまでCognitoからどの情報を取り寄せるかという意味でのscope。Cognitoのアプリクライアントで許可されたscopeしか取り寄せることができないので注意すること。
react-oidc-contextに記載するのはcognitoのauthorityです。Entra IDのものではありません。記事の最初の設計の図を見れば間違えることはないと思いますが念の為。
混乱しそうな部分
エンタープライズアプリケーションとアプリ登録
Microsoft Entra IDの設定で、SAMLの場合は「エンタープライズアプリケーション」を作成すると思いますが、OIDCの場合は「アプリ登録」をします。BtoB SaaSはエンタープライズアプリケーションだと思いますが、OIDCなのでアプリ登録です。
私の理解ではただ名前の問題で
- SAML: エンタープライズアプリケーションという
- OIDC: アプリという
というだけです。
構成されたアクセス許可
実は、Entra IDの構成されたアクセス許可を一切設定せずに「todo app」にログインしようとしても、同意画面が表示され、同意することでログインが可能です。そのようにログインした場合、Entra IDの設定画面は以下のように変化します。

Entra IDのアクセス許可の概要は以下に詳しく記載されています。
今回の「todo app」では管理者の同意までは不要で、ユーザーの同意さえあればログインできるケースになりますが、OneDriveのファイルを読み込むアプリケーションなど強い権限を必要とするアプリケーションでは、あらかじめ管理者の同意をしておく必要がありそうです。
最後に
この記事ではCognitoのユーザープールへSSOするEntra IDの設定を行いました。
初歩の内容になっていますので、詳しいことが知りたい場合この記事を参考に実際にEntraIDとCognitoのOIDC連携をして遊んでみてください。1時間もあればフロントエンドも含めて環境構築が可能だと思います。
情報が間違っていたり、足りていない部分があれば修正・追記しますのでご連絡ください。
ありがとうございました。
Discussion