web-dev-qa-db-ja.com

AWS API Gateway CORSはオプションで問題ありませんが、POST

SO)で他の関連する質問を見てきましたが、これは異なっているようです。実際、私の質問は これ と非常に似ていますが、 400ステータスの問題。

セットアップ:

  • aPIゲートウェイを介したラムダ関数
  • 認証:なし、APIキー必須:false
  • ステージへの展開:テスト

  • 1つのリソース、1 POSTラムダを統合するメソッド。

  • POSTエンドポイントを直接呼び出すと、たとえばcurlを使用すると、常に200が返されます(ペイロードの有無、不良ペイロードなど)。これは、参照されている質問とは異なります。

「CORSを有効にする」オプションを使用しました-このオプションをリソースとPOSTリクエスト(および後でAPIをデプロイする)の両方に適用しようとしました。

API GWでは、POSTメソッド-メソッド応答領域の下の200の応答ヘッダーにAccess-Control-Allow-Originがリストされています。

結果:Chromeのクライアントコードからエンドポイントを呼び出すと、OPTIONSは成功しますが、Access-Control-Allow-Originヘッダーがないため、POSTは失敗します。

カール中:OPTIONSコール

curl -X OPTIONS -H "Access-Control-Request-Method: POST" \
     -H "Access-Control-Request-Headers: Content-Type" \
     -H "Origin: http://example.com" --verbose <endpoint>

応答は次のとおりです。

< HTTP/1.1 200 OK
< Content-Type: application/json
...
< Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
< Access-Control-Allow-Methods: POST,OPTIONS
< Access-Control-Allow-Origin: *
...

しかし、POSTの場合:

curl -X POST -d '{}' -H "Content-Type: application/json" \
     -H "Origin: http://example.com" --verbose <endpoint>

それは戻ります:

< HTTP/1.1 200 OK
< Content-Type: application/json
...

応答のjson本体-ただし、Access-anythingヘッダーはありません。

他に何を確認できますか?

8
bebbi

問題は、APIゲートウェイがチェックされた"Lambda Proxy Integration"オプションを使用してラムダ関数を呼び出したことです。

新しく作成されたラムダ関数にAPIゲートウェイトリガーを追加すると、これはデフォルトでアクティブになると思います。

API Gateway-Resource-Methodビュー内では、[Integration Response]ボックスがグレー表示され、(Enable CORS関数の場合でも)そこにAccess-Control-Allow-Originヘッダーを追加する方法がないようです。@ Abhigna_Nagarajaによると必要とされている。

解決策:「LambdaProxy Integration」を使用している場合は、'Access-Control-Allow-Origin': '*'ヘッダーをラムダ関数に追加します。

さらに良い方法:同じビュー-統合リクエストで、「Lambda Proxy Integration」をオフにし、CORSを再度有効にします(後でデプロイします)。

(次に、コールバックで、{ statusCode, headers, body }オブジェクトの代わりにペイロードjsonのみを返す必要があります。)

更新

Httpステータスコードまたはjsonペイロードのどちらでリクエストレスポンスステータス情報を返すかわからない場合に役立ついくつかの読み取り:

httpステータスとjsonステータス

jsonステータス標準

18
bebbi

「EnableCORS」オプションは、すべての統合/メソッド応答ヘッダーマッピングを設定する便利なツールです。 [CORSを有効にする]をクリックしてから新しいリソースを追加した場合、必要な設定がありません。 [CORSを有効にする]をもう一度クリックするか、手動で次のように設定することができます

  • 'Access-Control-Allow-Origin'メソッド応答ヘッダーをPOSTメソッドに追加します
  • 'Access-Control-Allow-Origin'統合応答ヘッダーマッピングをPOSTメソッドに追加

また、curlを使用して変更をテストする前に、APIをデプロイすることを忘れないでください。

2