Amazon API Gateway API 用の AWS Lambda オーソライザーを作成すると、"401 Unauthorized" エラーが表示されます。
簡単な説明
Lambda オーソライザーを使用する API Gateway API が不正なリクエストを受け取ると、API Gateway は 401 Unauthorized レスポンスを返します。
注: API Gateway は、さまざまな理由で "401 Unauthorized" エラーを返します。この記事では、API Gateway の事前認証検証に失敗する認証情報 (トークン、ヘッダー、クエリパラメータ) の欠落または無効が原因で発生する 401 エラーについて説明します。これらのエラーは、Lambda オーソライザー関数を呼び出す前に API Gateway がリクエストを拒否した場合に発生します。
トークンベースの Lambda オーソライザーの場合
"401 Unauthorized" エラーは通常、必要なトークンがないか、オーソライザーのトークンが検証式を検証しなかった場合に発生します。
リクエストパラメータベースの Lambda オーソライザーの場合
"401 Unauthorized" エラーは通常、設定された ID ソースが見つからない、NULL、空、または有効でない場合に発生します。
この種のエラーをトラブルシューティングするには、API へのリクエストに含まれる必須情報を確認してください。次に、必要なヘッダーとトークン値、または ID ソースを指定して API を呼び出し、オーソライザーをテストします。
Lambda オーソライザーの設定例については、「TOKEN オーソライザー Lambda 関数の例」と「REQUEST オーソライザー Lambda 関数の例」を参照してください。
解決策
Lambda オーソライザーの設定を確認する
次の手順を実行します。
- API Gateway コンソールを開きます。
- [API] で、API の名前を選択します。
- API の名前の下で、[オーソライザー] を選択します。
- ユースケースに合ったオーソライザーの設定を確認します。
トークンベースの Lambda オーソライザー
Lambda イベントペイロードが [トークン] として設定されている場合は、トークンソースの値を確認します。API の呼び出しでは、トークンソースの値をリクエストヘッダーとして使用する必要があります。
重要: トークン検証に正規表現を入力すると、API Gateway はこの表現と照合してトークンを検証します。例えば、正規表現 \w{5} を入力した場合、5 文字の英数字文字列を含むトークン値のみが正常に検証されます。
リクエストパラメータベースの Lambda オーソライザー
Lambda イベントペイロードが [リクエスト] として設定されている場合は、設定されている ID ソースを確認します。ID ソースは、ヘッダー、クエリ文字列、複数値クエリ文字列、ステージ変数、または $context 変数である可能性があります。
重要: 認証キャッシュがオンになっている場合、API へのリクエストは設定されたすべての ID ソースと照合して検証されます。キャッシュをオフにして Lambda オーソライザーをテストしてください。
API をデプロイする
Lambda オーソライザーの設定またはその他の API 設定を変更した場合は、API を再デプロイして変更をコミットします。
Lambda オーソライザーをテストする
Lambda オーソライザーをテストするには、API Gateway コンソール、cURL、または Postman のいずれかを使用して API へのテスト呼び出しを行います。
重要: Lambda オーソライザーの設定に従ってリクエストをフォーマットしてください。
API Gateway コンソールを使用して Lambda オーソライザーをテストする
次の手順を実行します。
- API Gateway コンソールを開きます。
- [API] で、API の名前を選択します。
- API の名前の下で、[オーソライザー] を選択します。
- [オーソライザー] で、テストするオーソライザーの名前を選択します。
- [オーソライザーのテスト] で、ユースケースに合わせて次の手順を実行します。
トークンベースの Lambda オーソライザー
[オーソライザーのテスト] を選択し、[認証トークン] の値は指定しないでください。API Gateway はレスポンスコード: 401 を返します。これは認証トークンが空のためです。
正規表現 \w{5} を使用してトークン検証を設定した場合は、"abc123" など、無効な認証トークンの値を入力します。次に、[オーソライザーのテスト] をクリックします。API Gateway はレスポンスコード: 401 を返します。認証トークンがトークン検証式を満たしていないためです。
[認証トークン] の値に allow と入力し、[オーソライザーのテスト] をクリックします。API Gateway はレスポンスコード: 200 メッセージを返します。
リクエストパラメータベースの Lambda オーソライザー
リクエストパラメータを削除し、[オーソライザーのテスト] をクリックします。API Gateway はレスポンスコード: 401 を返します。これはリクエストパラメータがないためです。
[リクエストパラメータ] に headerValue1、queryValue1、stageValue1 と入力し、[オーソライザーのテスト] をクリックします。API Gateway はレスポンスコード: 200 メッセージを返します。
Postman または cURL を使用して Lambda オーソライザーをテストする
Postman を使用して Lambda オーソライザーをテストする方法については、「API Gateway Lambda オーソライザーで API を呼び出す」を参照してください。Postman の詳細については、Postman のウェブサイトを参照してください。
curl の詳細については、curl プロジェクトのウェブサイトの「curl」を参照してください。
注: テストする前に Lambda オーソライザーの認証キャッシュをオフにした場合は、テスト後に再度有効にしてください。
認証キャッシュを再度有効化したら、API を再デプロイして変更をコミットします。Lambda オーソライザーからクロスオリジンリソース共有 (CORS) エラーを受け取った場合は、DEFAULT 4XX API Gateway レスポンスの CORS ヘッダーを追加します。詳細については、「API Gateway が CORS エラーを返す場合のトラブルシューティング方法を教えてください」を参照してください。
関連情報
Amazon API Gateway とは何ですか?
API Gateway で REST API へのアクセスを制御および管理する
API Gateway REST API または WebSocket API のトラブルシューティング用に、CloudWatch Logs を有効にする方法を教えてください。