2016-10-20 29 views
3

他の関連する質問はまだ調べましたが、これは異なるようです。 実際、私の質問はと非常に似ていますが、私は400ステータスの問題がありません。AWS API Gateway CORS OPTIONSでOK、POSTで失敗しました

設定:なし、必要なAPI KEY:ステージに展開

  • 偽:テスト

  • 1リソース、1つのPOST

    • ラムダ関数APIゲートウェイ
    • 認証を通じてラムダを積分する方法。

    • たとえば、POSTエンドポイントを直接呼び出します。カールは常に200(ペイロードの有無にかかわらず、ペイロードが悪いなど)を返します。これは、参照されている質問とは異なります。

    私は「CORSを有効にする」オプションを使用しました。このオプションをリソースとPOST要求の両方に適用しようとしました(後でAPIを展開する)。

    API GWでは、Access-Control-Allow-OriginがPOSTメソッド - レスポンス領域の200レスポンスヘッダーに記載されています。

    結果: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-何もヘッダ。

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

  • 答えて

    12

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

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

    APIゲートウェイ - リソース - メソッドビューの内部では、「インテグレーションレスポンス」ボックスがグレー表示されていて、(CORS機能を有効にしていても)@Abhigna_NagarajaによるAccess-Control-Allow-Originヘッダーを追加する方法はないようです必要とされている。

    ソリューション: 「ラムダプロキシインテグレーション」を使用している場合は、'Access-Control-Allow-Origin': '*'ヘッダーをラムダ関数に追加します。

    同じビュー - 統合要求で、 "Lambda Proxy Integration"をオフにし、CORSを再度有効にしてください(後で展開してください)。

    (その後、コールバックで、あなたの代わりに{ statusCode, headers, body }オブジェクトのちょうどペイロードJSONを返す必要があります。)

    更新

    あなたがするかどうかわからない場合はいくつかの有用な読み取りHTTPステータスコードまたはJSONペイロードに要求応答ステータス情報を返す:

    http status vs json status

    json status standards

    +1

    新しい「ラムダプロキシインテグレーション」は、新しいANYメソッドを作成するだけなので、壊れていると思います。これはCORSと完全に統合されていないようで、デフォルトのLambdaトリガーウィザードでさえもそうです。今のところ、私は "ラムダプロキシインテグレーション"を無効にし、手動でGET/POSTメソッドを作成することによってのみこれを修正することができました。 – alexcasalboni

    +1

    私の経験では、その部分は働いていました。 ANYメソッドは、LPIの場合、すべてのメソッド(POST、GETなど)をラムダに送るキャッチオールです。ラムダに何か問題がある場合のエラーは非常に誤解を招きます。 – bebbi

    +0

    "Lambda Proxy Integration"は、ラムダ機能からのステータスコードと応答ヘッダーを制御する方法です。プロキシ統合を無効にすると、常に200応答が返され、応答コンテンツの設定のみが許可されます。 プロキシ統合が有効になっているAPI GWを使用する場合は、ラムダ内のCORSヘッダーの設定が必要になります。 (http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html) –

    2

    [Enable CORS]オプションは、すべての統合/メソッド応答ヘッダーのマッピングを設定する便利なツールです。 [Enable CORS]をクリックして新しいリソースを追加した場合、必要な設定は適用されません。あなた再び「CORSを有効にする」をクリックするか、または手動での方法

  • 追加「アクセス制御-Allow-を投稿する

    • 追加「アクセス制御 - 許可 - 起源」メソッドレスポンスヘッダーとしてそれを設定することができますOriginの統合レスポンスヘッダーマッピングからPOSTメソッドへ

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

  • +0

    あなたの提案どおりにすべてが行われました。しかし、私は手作業の手順で確認するときには注意しなければならない点があります。メソッドレスポンスは問題なく表示されますが、インテグレーションレスポンスは表示または編集できません。このボックスには、「プロキシ統合を設定してレスポンスを変換することはできません」と表示されます。私はラムダプロキシの統合を使用しています。これは私が見ている問題に関連していますか? – bebbi

    +0

    ラムダコールバックのヘッダーセクションにヘッダーを追加してヘッダーを取得できました。それはコードと設定の醜いミックスのように見えるので、私は、CORSが必要なときにラムダプロキシの統合を使用すべきではないと思う? – bebbi

    +0

    LPIのインテグレーションレスポンスへのCORSヘッダーの追加が修正されているかどうかは分かりますか? – bebbi

    関連する問題