Amazon API Gateway API の AWS Lambda オーソライザーを作成した後、「401 Unauthorized」(401 認可されていません) エラーが返されます。これが発生するのはなぜですか? また、この問題をトラブルシューティングするにはどうすればよいですか?
簡単な説明
注: API Gateway は、さまざまな理由で 401 Unauthorized エラーを返すことがあります。この記事では、オーソライザー Lambda 関数を呼び出さずに API Gateway から返される 401 Unauthorized レスポンスエラーに限定して説明します。
Lambda オーソライザーを備えた API Gateway API が承認されていないリクエストを受け取ると、API Gateway は 401 Unauthorized レスポンスを返します。
トークンベースの Lambda オーソライザーの場合
通常、必要なトークンが不足しているか、オーソライザーのトークン検証式によって検証されていない場合に、「401 Unauthorized」(401 認可されていません) エラーが発生します。
リクエストパラメータベースの Lambda オーソライザーの場合
「401 Unauthorized」(401 認可されていません) エラーは通常、設定されたアイデンティティソースが不足しているか、null、空、または無効である場合に発生します。
このタイプのエラーをトラブルシューティングするには、Lambda オーソライザーの設定を確認して、API へのリクエストに含める必要がある情報を確認します。その後、必要なヘッダーとトークン値、またはアイデンティティソースを使用して API を呼び出して、オーソライザーをテストします。
注: Lambda オーソライザーの設定例については、「トークンベースの Lambda オーソライザー関数を作成する」および「リクエストベースの Lambda オーソライザー関数を作成する」を参照してください。
解決方法
Lambda オーソライザーの設定を確認する
1. API Gateway Console にログインします。
2. [API] ペインで、API の名前を選択します。
3. ナビゲーションペインで、API の名前の下にある [Authorizers] (オーソライザー) を選択します。[Authorizers] (オーソライザー) ページが開きます。
4. ユースケースに基づいて、次のいずれかについてオーソライザーの設定を確認します。
トークンベースの Lambda オーソライザーの場合
[Lambda Event Payload] (Lambda イベントペイロード) が [Token] (トークン) として設定されている場合は、[Token Source] (トークンソース) の値を確認します。[Token Source] (トークンソース) の値は、API の呼び出しでリクエストヘッダーとして使用する必要があります。
重要: [Token Validation] (トークン検証) に正規表現を入力した場合、API Gateway は、この式に対してトークンを検証します。例えば、正規表現 \ w{5} を入力した場合、5 文字の英数字の文字列を含むトークン値のみが検証されます。
リクエストパラメータベースの Lambda オーソライザーの場合
[Lambda Event Payload] (Lambda イベントペイロード) が [Request] (リクエスト) に設定されている場合は、設定されているアイデンティティソースを確認します。アイデンティティーソースは、ヘッダー、クエリ文字列、複数の値を持つクエリ文字列、ステージ変数、または $context 変数です。
重要: [Authorization Caching] (認可のキャッシュ) が有効な場合、API へのリクエストは、設定済みのすべてのアイデンティティソースに対して検証されます。
5. [Authorization cached for 1 minutes] (1 分間キャッシュされた認可) などの [Authorization Caching] (認可のキャッシュ) が有効な場合、次のステップのテストのためにキャッシュをオフにします。
詳細については、「API Gateway コンソールを使用した Lambda オーソライザーの設定」を参照してください。
API をデプロイする
Lambda オーソライザーの設定またはその他の API 設定を変更した場合は、API を再デプロイして変更をコミットします。
Lambda オーソライザーをテストする
Lambda オーソライザーをテストするには、次のいずれかを実行して API に対するテスト呼び出しを実行します。
重要: Lambda オーソライザーの設定に従ってリクエストをフォーマットしてください。
API Gateway コンソールを使用して Lambda オーソライザーをテストするには
1. API Gateway Console にログインします。
2. [API] ペインで、API の名前を選択します。
3. ナビゲーションペインで、API の名前の下にある [Authorizers] (オーソライザー) を選択します。
4. [Authorizers] (オーソライザー) ページで、オーソライザーの [Test] (テスト) を選択します。
5. [Test Authorizer] (オーソライザーのテスト) ダイアログボックスで、ユースケースに基づいて次のいずれかを実行します。
トークンベースの Lambda オーソライザーの場合
1. [Authorization Token] (認証トークン) に値を指定せずに [Test] (テスト) を選択します。 [Authorization Token] (認証トークン) が空なので、API Gateway は Response Code: 401 (レスポンスコード: 401) を返します。
2. 正規表現 \ w{5} の [Token Validation] (トークン検証) が設定されている場合、有効でない値 (「abc123」など) を [Authorization Token] (認可トークン) として入力します。その後、[Test] (テスト) を選択します。[Authorization Token] (認可トークン) が [Token Validation] (トークン検証) 式を満たさないので、API Gateway は「Response Code: 401」(レスポンスコード: 401) を返します。
3. [Authorization Token] (認証トークン) の値に「allow」と入力して [Test] (テスト) を選択します。API Gateway は Response Code: 200 (レスポンスコード: 200) メッセージを返します。
リクエストパラメータベースの Lambda オーソライザーの場合
1. リクエストパラメータを削除し、[Test] を選択します。リクエストパラメータがないので、API Gateway は Response Code: 401 (レスポンスコード: 401) を返します。
2. [Request Parameters] (リクエストパラメータ) に「headerValue1」、「queryValue1」、「stageValue1」と入力し、[Test] (テスト) を選択します。API Gateway は Response Code: 200 (レスポンスコード: 200) メッセージを返します。
Postman または curl を使用して Lambda オーソライザーをテストするには
Postman アプリケーションを使用して Lambda オーソライザーをテストする方法については、API Gateway Lambda オーソライザーで API を呼び出すを参照してください。
curl の詳細については、cURL プロジェクトのウェブサイトを参照してください。
注:
- テストを実行する前に Lambda オーソライザーの [Authorization Caching] (認可のキャッシュ) をオフにした場合は、テスト後に再度アクティブ化できます。[Authorization Caching] (認可のキャッシュ) を再アクティブ化する場合は、API を再デプロイして変更をコミットしてください。
- Lambda オーソライザーからオリジン間リソース共有 (CORS) エラーを受け取った場合は、DEFAULT 4XX API Gateway レスポンス用に CORS ヘッダーを追加できます。詳細については、「API Gateway API からの CORS エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。
関連情報
API Gateway での REST API へのアクセスの制御と管理
API Gateway の REST API または WebSocket API のトラブルシューティングのために Amazon CloudWatch Logs をオンにするにはどうすればよいですか?