2016-02-08 37 views
4

因此,我已啓用CORS並通過AWS Gateway提供的基本設置。但是對於這個API,我需要允許所有請求的控制起源並允許憑證。API網關CORS問題

這裏是什麼樣子

enter image description here

,因爲你可能已經猜到是這樣的設置不通過CORS允許的問題,你不能有原產地通配符和有證書爲真。通常情況下,解決此問題的方法是隻抓取請求域並將其添加到源標頭中。這或多或少是我想要做的。但我不知道如何獲取這些信息並將其作爲映射值添加。 API網關在哪裏存儲這些信息,以及如何獲取該信息?

更新: 我必須通過HTTP標頭主機到我早些時候提到的Lambda函數,我試着實現下面的答案,但是我不能通過使用提供的指令將標題傳遞給Lambda函數。任何更多的援助,這是非常感謝。

+0

感謝您的反饋。我們最近剛剛增加了對通過'Host'a的支持nd'User-Agent'標題本週。你可以嘗試再次訪問這些頭文件嗎?請讓我知道它是否適合你。謝謝,尤爾根 - API網關 – Jurgen

回答

5

好了之後的研究小時的在互聯網上找到的信息比特我有一個解決方案,並希望這是對別人有用。

要傳遞的HTTP報頭是一個不能用AWS API網關提供的默認值,然後訪問經由lambda函數數據並返回,在響應標頭數據按照以下

  1. 在步驟「方法請求「轉到」HTTP請求標題「並添加您想要的標題進行捕獲。即。如果我們想要獲取API url的主機值,可以在這裏輸入「Host」。如果你想獲得呼叫者的網站主機使用「Origin」

  2. 在「集成請求」中,如果「application/json」不存在,則轉到映射模板並創建一個新模板,如果它只是更新它。

這是重要的部分,傳遞您在步驟1中設置的標題值。要做到這一點,請在模板框中寫下類似以下內容。

{ 
    "origin" : "$input.params().header.Origin", 
    "host" : "$input.params().header.Host" 
} 

您也可以傳入您在同一個JSON中定義的任何url參數。

  1. 從Lambda訪問數據,如果使用Node作爲Lambda後端代碼,集成請求會將信息傳遞到「Event」參數中。檢索任何頭的值只需在你的處理程序中使用以下內容。

    event.origin; 
    
  2. 當送回從LAMBDA您迴應API網關,最好是格式化JSON響應。類似的東西。

    { 
        "origin" : event.origin, 
        "host" : event.host, 
        "nonHeaderOutput" : "Hello World" 
    } 
    
  3. 在「合併響應」到「頭映射」,如果你需要的頭未列出您可以在「方法響應」添加它,然後它會出現在這裏。在這個例子中,我使用了「Access-Control-Allow-Origin」,並將映射值編輯爲integration.response.body.origin

  4. 現在轉到「映射模板並選擇要使用的內容類型,然後編輯模板以訪問加入這個在模板框中

    $input.path("$.nonHeaderOutput") 
    

這就是它現在被送到API可以在你的方法響應使用的頭非頭的響應。

+0

如果我執行你的解決方案,我需要以任何方式修改客戶端代碼嗎?當我嘗試調用新部署的資源時,收到消息'未捕獲的主機必須被定義'。 –

+0

自從去年寫了一些更新以來,他們已經做了一些更新,但是這個理論依然成立,我需要更多地瞭解你想要做什麼來幫助你。 – wmfrancia

+0

沒有必要,我確定CORS錯誤實際上只是一個錯誤地被標記爲CORS錯誤的權限錯誤。 –

3

Jurgen從API網關這裏。 感謝您報告此問題。目前沒有簡單的方法通過控制檯中的「啓用CORS」功能進行設置。但是,我們正在研究它以改善此用例的用戶體驗。

作爲一種潛在的解決方法,您可以將來自客戶端的Origin標頭傳遞到您的後端,並在那裏解析/創建Access-Control-Allow-Origin標頭的值。然後,您將集成響應中的標題從'integration.response.header.Access-Control-Allow-Origin'映射到Access-Control-Allow-Origin並將其返回給客戶端。

希望這會有所幫助。

最佳, 尤爾根

+0

謝謝,我想我可以將值與我的其餘迴應並在那裏處理。 – wmfrancia

+0

跟進問題。我如何通過Origin Header,即包含哪個API變量。 – wmfrancia

+0

您需要在方法請求中指定Origin標頭。在集成請求中,您可以通過method.request.header.Origin來訪問它。對於集成響應,您可以使用integration.response.header.XYZ。您可以查看如何在此設置方法請求和響應標頭:http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-method-settings.html#how-to-method-設置 - 執行 - 控制檯 – Jurgen