Amazon Cognito ユーザープールを設定した後、API Gateway REST API エンドポイントの「401 Unauthorized」(401 未承認) エラーをトラブルシューティングするにはどうすればよいですか?

最終更新日: 2022 年 8 月 18 日

Amazon API Gateway REST API で、Amazon Cognito ユーザープールを COGNITO_USER_POOLS オーソライザーとして設定しました。API レスポンスで「401 Unauthorized」エラーを受け取るようになりました。このエラーのトラブルシューティング方法を教えてください。

解決方法

注: API Gateway は、さまざまな理由で 401 Unauthorized エラーを返すことがあります。次の手順は、COGNITO_USER_POOLS オーソライザーのみに関連する 401 エラーのトラブルシューティング方法を示しています。

API メソッドでのオーソライザーの設定を確認する

1.    API Gateway コンソールの [API] ペインで、作成した API の名前を選択します。

2.    ナビゲーションペインで、API の [Authorizers] (オーソライザー) を選択します。

3.    オーソライザーの設定を確認し、次の条件に該当することを確認します。
ユーザープール ID がトークンの発行元と一致する。
API がデプロイされている。
オーソライザーはテストモードで動作する。

詳細については、「REST API と Amazon Cognito ユーザープールを統合する」を参照してください。

注: API メソッドでオーソライザーの設定を確認した後で API を呼び出すことができない場合は、セキュリティトークンが有効であるかを確認してください。

セキュリティトークンの有効性を確認する

セキュリティトークンの有効性を確認するときは、次の条件に該当することを確認します。

  • セキュリティトークンの有効期限が切れていない。
  • セキュリティトークンの発行者は、API で設定された Amazon Cognito ユーザープールと一致する。
  • ID トークンアクセストークン文字列の値が有効である。
    注: 文字列の値が有効な場合は、トークンをデコードできます。トークンが有効でない場合は、リクエストヘッダーに渡されたときに、トークンにスペースが追加されていないことを確認してください。

重要: API Gateway メソッドで追加のスコープが設定されていない場合は、有効な ID トークンを使用していることを確認してください。API Gateway メソッドで追加のスコープが設定されている場合は、有効なアクセストークンを使用していることを確認してください。詳細については、「REST API と Amazon Cognito ユーザープールを統合する」および「using Amazon Cognito custom scopes in API Gateway」(API Gateway での Amazon Cognito カスタムスコープの使用) を参照してください。

セキュリティトークンのペイロードの例

Id token payload:
 {
 "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
 "aud": "xxxxxxxxxxxxexample",
 "email_verified": true,
 "token_use": "id",
 "auth_time": 1500009400,
 "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
 "cognito:username": "janedoe",
 "exp": 1500013000,
 "given_name": "Jane",
 "iat": 1500009400,
 "email": "janedoe@example.com"
 }
Access token payload:
{
    "auth_time": 1500009400,
    "exp": 1500013000,
    "iat": 1500009400,
    "iss": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example",
    "scope": "aws.cognito.signin.user.admin",
    "sub": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "token_use": "access",
    "username": "janedoe@example.com"
}

セキュリティトークンのペイロードの例では、次のクレーム名に注意してください。

  • token_use はトークンの種類 (ID またはアクセストークン) を示します。
  • exp は、トークンの有効期限を示します。
    注: exp クレームは、Unix エポック (1970-01-01T0:0:0Z) から、協定世界時 (UTC) でトークンの有効期限が切れるまでの秒数で表されます。
  • auth_time は、トークンが発行された日時を示します。
  • iss は、トークンを発行したユーザープールのドメインを示します。

重要:

  • 使用しているトークンが、API Gateway メソッドで設定されているユーザープールと一致していることを確認してください。それでも API を呼び出すことができない場合は、認証ヘッダーを正しく使用していることを確認してください。
  • それでも 401 エラーが表示される場合は、リソースポリシーがリクエストをブロックしていないことを確認してください。

Postman を使用して API を呼び出す場合

Amazon Cognito トークンを直接使用するには、OAuth 2.0 認証モードを使用します。OAuth 2.0 認証モードを設定するときは、次の条件に該当することを確認します。

  • [Grant type] (付与タイプ) は、ユーザープールのアプリクライアントの設定に従って、[Authorization code] (承認コード) または [authorization implicit] (暗黙的な承認) である。
  • コールバック URL は、ユーザープールのアプリクライアントで設定されたリダイレクトされた URL と一致する。
  • 認証 URL は次の形式になっている。
https://mydomain.auth.us-east-1.amazoncognito.com/login

重要: mydomain を、ユーザープールの設定に使用するドメイン名に置き換えます。API がホストされている正しい AWS リージョンを入力していることを確認します。

  • [Client ID] (クライアント ID) が、ユーザープールのアプリクライアント ID である。
    注: クライアントシークレットがユーザープールのアプリクライアントに関連付けられている場合は、[client secret] (クライアントシークレット) フィールドの [Authorization] (認証) タブで、クライアントシークレットを指定してください。クライアントシークレットがユーザープールのアプリクライアントに関連付けられていない場合は、[client secret] (クライアントシークレット) フィールドを空白のままにします。
  • [Scope] (スコープ) は [openid] として設定されている。
    注: openid スコープは、ユーザープールのアプリクライアントでも許可されている必要があります。
  • [認証コードフロー] には、正しい Amazon Cognito ユーザープールトークンエンドポイントが入力されている。

Amazon Cognito ユーザープールのトークンエンドポイントの例

https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

注: Postman は、必要なコンテンツタイプをトークンエンドポイントに渡さない可能性があります。その結果、405 エラーが発生する場合があります。ただし、暗黙的なフローを使用すると、504 エラーが表示されません。