Amazon Cognito 備忘録：アプリクライアント設定で Allowed Logout URLs が logout_url と一致しているかを確認する方法

## はじめに  
AWS Cognito を利用する際、ログアウト処理の適切な設定は重要です。

:::note warn
**特に `logout_url` と `Allowed Logout URLs` が一致していないと、意図したログアウト動作ができないことがあります。**
:::

本記事では、Cognito のログアウト設定を確認する手順や、AWS マネジメントコンソール・CLI での確認方法を紹介します。  

## 書こうと思ったきっかけ  
Cognito を利用した認証機能を実装する中で、ログアウト後のリダイレクト先の設定に問題が発生しました。

:::note info
**特に `logout_url` が `Allowed Logout URLs` に登録されていないとログアウト時にエラーとなることがありました。**
:::

そこで、ログアウト設定の確認手順を整理し、環境変数や AWS マネコン側でどのように設定すべきかを明確にするため、本記事をまとめることにしました。  

## 確認手順について
### AWS マネジメントコンソールでの確認
1. **AWS マネジメントコンソールにログイン**
2. **Cognito コンソール** にアクセス
3. **ユーザープールを選択**
   - 該当のユーザープールを選択する
4. **アプリ統合の設定**
   - 左のメニューから「アプリ統合」を開く
   - 「アプリクライアントの設定」セクションを確認
5. **Allowed Logout URLs の確認**
   - 「サインアウトURL」（Allowed Logout URLs）の項目を確認し、`logout_url` と比較
   - `http` / `https` の違いや末尾の `/` の有無にも注意

**実際の確認画面**

![Screenshot 2025-02-14 at 8.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e8f4acce-cebb-432f-925c-201bda88104b.png)

### CLIでの確認方法
AWS CLI を使用して `Allowed Logout URLs` を取得することも可能です。

```sh
aws cognito-idp describe-user-pool-client \
    --user-pool-id <USER_POOL_ID> \
    --client-id <CLIENT_ID> \
    --query "UserPoolClient.LogoutURLs"
```

これにより、Cognito に登録されている `Allowed Logout URLs` を取得できるので、`logout_url` と比較してください。

**実際の確認画面**

![Screenshot 2025-02-14 at 8.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f4c4857e-3224-4c35-a0a9-d0d00107cf59.png)

## logout_url を確認する方法
`logout_url` がどこで設定されているかにより確認方法が異なります。

### フロントエンドのコードで確認
アプリケーションのログアウト処理を実装している部分に `logout_url` が記述されている可能性があります。

```js
const logout_url = `https://yourdomain.auth.<region>.amazoncognito.com/logout?client_id=<CLIENT_ID>&logout_uri=https://yourapp.com/logout`;
```

または、環境変数 (`.env`) に設定されていることもあります。

```sh
NEXT_PUBLIC_COGNITO_LOGOUT_URL=https://yourdomain.auth.<region>.amazoncognito.com/logout
```

### バックエンド（API）の設定を確認
バックエンドでログアウト処理 (`logout_url`) を設定している場合、環境変数や設定ファイルに記述されている可能性があります。

```sh
export LOGOUT_URL="https://yourdomain.auth.<region>.amazoncognito.com/logout?client_id=<CLIENT_ID>&logout_uri=https://yourapp.com/logout"
```

または設定ファイル (`config.py`, `.env`, `settings.json` など) に記載されている可能性があります。

```py
LOGOUT_URL = "https://yourdomain.auth.<region>.amazoncognito.com/logout?client_id=<CLIENT_ID>&logout_uri=https://yourapp.com/logout"
```

### Cognitoのアプリ統合設定を確認
Cognito の「アプリ統合」設定に `logout_url` を設定している場合、AWS マネジメントコンソールから確認できます。

#### 確認手順
1. AWS マネジメントコンソールにログイン
2. Cognito → ユーザープールを開く
3. 「アプリ統合」 → 「アプリクライアントの設定」へ移動
4. 「サインアウトURL」(Allowed Logout URLs) を確認

### AWS CLI で確認
```sh
aws cognito-idp describe-user-pool-client \
    --user-pool-id <USER_POOL_ID> \
    --client-id <CLIENT_ID> \
    --query "UserPoolClient.LogoutURLs"
```

## Allowed Logout URLs と logout_url を一致させる必要がある

**理由**
Cognito のログアウト処理では、ユーザーがログアウト後にリダイレクトされるURLを `logout_uri`（または `logout_url`）として指定します。

このURLが Cognito の `Allowed Logout URLs` に登録されていないと、ログアウト時にエラーが発生します。

### 対処方法
#### ✅ AWS マネジメントコンソールでの設定手順
1. AWS マネジメントコンソールにログイン
2. Cognito > ユーザープール > 対象のユーザープールを選択
3. 「アプリ統合」 > 「アプリクライアントの設定」
4. 「サインアウトURL」(Allowed Logout URLs) に `logout_url` を追加
5. 保存して設定を反映

#### ✅ CLIで設定を確認・更新
**確認**
```sh
aws cognito-idp describe-user-pool-client \
    --user-pool-id <USER_POOL_ID> \
    --client-id <CLIENT_ID> \
    --query "UserPoolClient.LogoutURLs"
```

**追加・更新**
```sh
aws cognito-idp update-user-pool-client \
    --user-pool-id <USER_POOL_ID> \
    --client-id <CLIENT_ID> \
    --logout-urls "https://yourapp.com/logout"
```

## `.env` 側か、AWSのマネコン側どちらで変更すべき？

### `.env` を変更すべきケース
- `.env` に設定されている `logout_url` が Cognito の `Allowed Logout URLs` に登録済みの場合。
- フロントエンドやバックエンドのリダイレクト先を変更したい場合。

**✅ 変更方法**
```sh
LOGOUT_URL="https://yourapp.com/logout"
```

### AWS マネコン側を変更すべきケース
- `.env` の `logout_url` を変えたくない場合（他の環境と統一したい）。
- 複数の `logout_url` を許可したい場合（例: 本番用と開発用を両方登録）。
- 現在の `logout_url` が Cognito 側に登録されていない場合。

**✅ 変更手順（AWS マネコン）**
1. AWS マネジメントコンソールにログイン
2. Cognito → ユーザープール → 該当のユーザープールを選択
3. 「アプリ統合」 > 「アプリクライアントの設定」
4. 「サインアウトURL」(Allowed Logout URLs) に `.env` の `logout_url` を追加
5. 保存して適用

### **まとめ**
- **`logout_url` を変えても問題ないなら `.env` を Cognito の `Allowed Logout URLs` に合わせる**
- **`logout_url` を変えたくないなら Cognito 側の `Allowed Logout URLs` に `.env` の `logout_url` を追加する**
- **迷ったら、まず Cognito 側の `Allowed Logout URLs` に `.env` の `logout_url` を追加してみるのが安全**

これで、Cognito のログアウトURL設定を適切に管理できます！