スキップしてコンテンツを表示

Amazon Cognito ユーザープールをセットアップした後に API Gateway REST API エンドポイントで発生する "401 Unauthorized" エラーをトラブルシューティングする方法を教えてください。

所要時間2分
0

Amazon Cognito ユーザープールを Amazon API Gateway REST API の COGNITO_USER_POOLS オーソライザーとして設定したところ、API 応答で "401 Unauthorized" エラーが発生します。

解決策

注: API Gateway が 401 Unauthorized エラーを返す原因は、複数あります。次の手順では、COGNITO_USER_POOLS オーソライザーに関連する 401 エラーのみをトラブルシューティングする方法を示します。

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

次の手順を実行します。

  1. API Gateway コンソールを開きます。
  2. ナビゲーションペインで **[API]**を選択し、目的の API を選択します。
  3. ナビゲーションペインでその API の [オーソライザー] を選択します。
  4. オーソライザーの構成をレビューし、次の条件が満たされていることを確認します。
    ユーザープール ID はトークンの発行者と一致すること。
    API がデプロイ済みであること。
    オーソライザーは ID トークンに対し、テストモードで動作していること。
    注: この機能では、アクセストークンをテストすることはできません。

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

注: オーソライザーの構成を確認した後、API を呼び出せない場合は、セキュリティトークンの有効性を確認してください。

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

セキュリティトークンの有効性を確認するには、次の条件が満たされていることを確認します。

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

重要: API Gateway メソッドにスコープを設定していない場合は、有効な ID トークンを使用する必要があります。API Gateway メソッドに追加のスコープを設定する場合は、有効なアクセストークンを使用する必要があります。詳細については、「Amazon Cognito のカスタムスコープを使用して API Gateway の API へのアクセスを認可するにはどうすればよいですか」を参照してください。

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

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 認証モードを使用します。詳細については、Postman のウェブサイトで「API authentication and authorization in Postman (Postman における API 認証と承認)」を参照してください。

OAuth 2.0 認証モードを構成する際は、次の条件が満たされていることを確認します。

  • 付与タイプオプションが Authorization code または Authorization implicit に設定されていること。
  • コールバック URL は、ユーザープールのアプリクライアントに設定したリダイレクト URL と一致すること。
  • Auth URL が次の形式に従っていること: https://mydomain.auth.us-east-1.amazoncognito.com/login
    注: mydomain をユーザープールの構成に指定したドメイン名に置き換えてください。API をホストする AWS リージョンを正しく入力したことを確認してください。
  • Client ID は、ユーザープールのアプリクライアント ID であること。
    注: クライアントシークレットをユーザープールのアプリクライアントに関連付ける場合は、[認証] タブでシークレットを指定します。ユーザープールのアプリクライアントにクライアントシークレットが関連付けられていない場合は、[クライアントシークレット] フィールドを空白のままにします。
  • [スコープ] は、Openid に設定されていること。
    注: ユーザープールのアプリクライアントでスコープ Openid を許可する必要があります。
  • [認証コードフロー] に適切な Amazon Cognito ユーザープールのトークンエンドポイントを入力する。
    Amazon Cognito ユーザープールのトークンエンドポイント例:
    https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token

注: トークンエンドポイントがコンテンツタイプをサポートしていない場合、Postman は必要なコンテンツを渡すことができず、405 エラーが発生します。この問題を回避するには、暗黙のフローを使用してください。詳細については、「OAuth 2.0 grants (OAuth 2.0 許可)」を参照してください。

関連情報

Secure API access with Amazon Cognito federated identities, Amazon Cognito user pools, and API Gateway (Amazon Cognito フェデレ―テッド ID、Amazon Cognito ユーザープール、Amazon API ゲートウェイによる安全な API アクセス)

Amazon Cognito JSON ウェブトークンのデコード方法や署名の検証方法について教えてください。

Amazon Cognito ユーザープールをオーソライザーとして使用して REST API へのアクセスを制御する

AWS公式更新しました 3ヶ月前
コメントはありません

関連するコンテンツ