AWS CognitoとMicrosoft Entra IDでSSO実践入門

## やったこと

SSOに触れたことがなくざっくりと仕組みを理解したかったので、Cognitoのマネージドログインページ画面からMicrosoft Entra ID（旧Azure AD）でSSOしました。


### シーケンス図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/654a627c-e1dd-46ee-a283-36fbf441ee97.png)

ログイン後、Cognitoのユーザープールにユーザが追加されていることや属性マッピングができていることを確認するところまで実施しています。


![スクリーンショット 2025-04-24 8.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/27e7762a-7004-4448-af96-c0174adc6a34.png)

AzureとAWSとでそれぞれ設定が必要ですが、数分あればできるので思ったよりも簡単でした。

以下では、設定手順を記載していきます。


## Cognitoの作成（AWS）

Cognitoのユーザープールを作成しましょう。

今回はCDKで作成したので詳細は省きますが、アプリケーションクライアントの作成ができればとりあえずなんでもいいと思います。

![スクリーンショット 2025-04-24 7.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/c20316a1-244e-4307-aa83-d423e8b603cd.png)



## アプリケーションの作成（Azure）

エンタープライズ アプリケーションから新しいアプリケーションを作成します。

[+ 新しいアプリケーション]から[+ 独自のアプリケーションの作成]を選択して「ギャラリーに見つからないその他のアプリケーションを統合します (ギャラリー以外)」を選択して作成します。

![スクリーンショット 2025-04-24 7.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/8f6ced75-2e19-4249-bcc2-4012106f5a18.png)


## SSO設定（Azure）

アプリ設定画面からSSOの設定をしていきます。実施する内容は主に２点です。

* 識別子の追加
* 応答 URLの追加
* SAML証明書の取得（Cognito側の設定で使います）

[シングル サインオン]から[SAML]を選択して、遷移先のセットアップ画面で基本的なSAML構成を編集していきます。

![スクリーンショット 2025-04-24 8.03.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/b568739b-3b4f-4834-962a-422e9c9191bd.png)

以下のフォーマットに従って追加します。

```
識別子の追加
urn:amazon:cognito:sp:<UserPoolID>

応答 URLの追加
https://<Cognitoドメイン>/saml2/idpresponse
```

最後にSAML証明書（フェデレーション メタデータ XML）をダウンロードします。

![スクリーンショット 2025-04-24 8.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/9de9f47b-eeeb-499a-9f0d-cfed3c9647d7.png)

## ユーザーの追加（Azure）

ログインするためのユーザを追加しておきます。

![スクリーンショット 2025-04-24 8.18.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/a51695d6-ec84-4cdf-a00d-a1de269d6340.png)


## アイデンティティプロバイダーを追加（AWS）

Cognitoのユーザープール画面の[ソーシャルプロバイダーと外部プロバイダー]からアイデンティティプロバイダーを追加します。フェデレーティッドサインインのオプションはSAMLを選択し、先ほどダウンロードしたXMLファイルをメタデータドキュメントにアップロードします。SAML プロバイダーとユーザープールの間で属性をマッピングの欄には`http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress`を入力します。これを入力することでメールアドレスのマッピングが可能になります。

![スクリーンショット 2025-04-24 8.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/49ce5f10-c613-464c-9c32-67b04a3f5bd2.png)

## 動作確認

アプリケーションクライアントから作成しておいたクライアントを選択してマネージドログインページの設定のプロバイダー部分を先ほど作成したアイデンティティプロバイダーに修正してログインページに遷移します。

![スクリーンショット 2025-04-24 7.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/c33b52e8-552d-4cb8-959c-3608e206290d.png)

無事にサインイン画面に到達しました。

![スクリーンショット 2025-04-23 23.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/4248ea68-5c3d-42ff-a5da-c5dd9fdac148.png)

Cognitoのユーザを確認したところ追加されていました。

![スクリーンショット 2025-04-24 8.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654639/27e7762a-7004-4448-af96-c0174adc6a34.png)


## ハマったところ

ダミーで作成したユーザにメールアドレスを設定するのを忘れていてエラーがでたぐらいです。


```
error_description=Invalid+SAML+response+received%3A+Invalid+user+attributes%3A+emails%3A+The+attribute+emails+is+required+&error=server_error
```


## 参考

https://www.divx.co.jp/media/257

https://dev.classmethod.jp/articles/genu-saml-with-entra-id/