Amazon Cognito 備忘録：「NotAuthorizedException: Access Token does not have required scopes」エラーについて

## はじめに  
AWS Cognito を使用したアプリケーションで、`GetUser` API を呼び出した際に `NotAuthorizedException: Access Token does not have required scopes` というエラーが発生しました。

:::note warn
**このエラーは、アクセストークンに必要なスコープが含まれていないために起こります。**
:::

今回は、このエラーの原因を調査し、適切な解決策を見つけるまでの流れをまとめました。***同じ問題に直面した方の参考になれば幸いです。***

## 書こうと思ったきっかけ  
Cognito を使った認証処理を実装していた際に、アクセストークンのスコープに関するエラーに遭遇しました。

:::note info
**公式ドキュメントを確認しながら調査しましたが、必要なスコープの設定ミスが原因だと特定するのに時間がかかりました。**
:::

この問題を解決するために試したことや、最終的な対応方法を整理しておくことで、今後の自分の備忘録としても役立つと考えました。

## 困っていたエラー

```log
Failed to get user info from Cognito: operation error Cognito Identity Provider: GetUser, https response error StatusCode: 400, RequestID: xxx, NotAuthorizedException: Access Token does not have required scopes
```

このエラーは、AWS Cognito で `GetUser` API を呼び出した際に、アクセストークンに必要なスコープが含まれていないために発生しています。

### **エラーの詳細**

- **`NotAuthorizedException: Access Token does not have required scopes`**  
  → アクセストークンに必要なスコープ（権限）が不足しているため、`GetUser` の呼び出しが失敗している。

## **考えられる原因**

### **1. Cognito ユーザープールでの OAuth スコープ設定が不十分**  
- `GetUser` を実行するには、アクセストークンに `aws.cognito.signin.user.admin` スコープが必要。  
- クライアントアプリケーションに、適切なスコープ (`openid`, `profile`, `email` など) が付与されていない可能性。

### **2. アクセストークンが `authorization_code` フローで取得されていない**  
- Cognito のトークンを取得する際に、`authorization_code` フロー（OAuth2）ではなく `implicit` フローを使っている場合、必要なスコープが含まれないことがある。

### **3. アクセストークンが既に期限切れ**  
- Cognito のアクセストークンはデフォルトで **1時間** 有効。  
- 期限切れのトークンを使用している場合も、アクセス権限エラーが発生する。

### **4. クライアントアプリ（App Client）に正しいスコープが割り当てられていない**  
- Cognito コンソールで、OAuth 設定の「許可されたスコープ」に `aws.cognito.signin.user.admin` が含まれているか確認。

## **今回の解決策について**

今回の **`NotAuthorizedException: Access Token does not have required scopes`** エラーの原因は、アクセストークンに必要なスコープが含まれていなかったことでした。

### **OAuth スコープの修正**
環境変数 `VITE_COGNITO_SCOPE` に `aws.cognito.signin.user.admin` を追加。

**修正前:**  
```plaintext
VITE_COGNITO_SCOPE="openid profile email"
```

**修正後:**  
```plaintext
VITE_COGNITO_SCOPE="email openid phone profile aws.cognito.signin.user.admin"
```

### **Cognito の OAuth スコープ設定を確認**  
AWS コンソール → Cognito → ユーザープール → アプリクライアントの設定 で  
`aws.cognito.signin.user.admin` が許可されているか確認。

## **アクセストークンを取得し直す**

### **curl で scope を指定して新しいトークンを取得**

以下の `curl` コマンドを使用して、新しいアクセストークンを取得します。

```sh
curl -X POST "https://your-cognito-domain.auth.ap-northeast-1.amazoncognito.com/oauth2/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=authorization_code&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code=YOUR_AUTHORIZATION_CODE&redirect_uri=YOUR_REDIRECT_URI&scope=email openid phone profile aws.cognito.signin.user.admin"
```

## **アクセストークンの内容を確認**

取得したアクセストークンが正しいスコープを持っているかを確認するため、JWT のデコードサイトを使用します。

1. [JWT デコードサイト（例: jwt.io）](https://jwt.io/) にアクセス  
2. 取得したアクセストークンを **"Encoded"** 欄に貼り付ける  
3. **"Decoded"** 欄の `scope` フィールドに `aws.cognito.signin.user.admin` が含まれていることを確認  

## **まとめ**

`VITE_COGNITO_SCOPE` に `aws.cognito.signin.user.admin` を追加することで、Cognito の `GetUser` API 実行時に必要なスコープが含まれるようになり、`NotAuthorizedException: Access Token does not have required scopes` エラーが解決しました。

**この内容が誰かの技術の支えになれば幸いです！**

## こちらも参考にしてみてください

https://qiita.com/kojiro513/items/042a534a9e5a71bf4fb1