CORS API Gateway RESTAPIs中針對 的 - Amazon API Gateway

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CORS API Gateway RESTAPIs中針對 的

跨來源資源共用 (CORS) 是一種瀏覽器安全功能,可限制從瀏覽器中執行的指令碼啟動的跨來源HTTP請求。如需詳細資訊,請參閱什麼是 CORS?

決定是否啟用CORS支援

跨來源HTTP請求是針對下列項目提出的請求:

  • 不同的網域 (例如,從 example.comamazondomains.com)

  • 不同的子網域 (例如,從 example.competstore.example.com)

  • 不同的連接埠 (例如,從 example.comexample.com:10777)

  • 不同的通訊協定 (例如,從 https://example.comhttp://example.com)

如果您無法存取 API並收到包含 的錯誤訊息Cross-Origin Request Blocked,您可能需要啟用 CORS。

跨來源HTTP請求可分為兩種類型:簡單請求和非簡單請求。

CORS 為簡單請求啟用

如果下列所有條件都為 true,則HTTP請求非常簡單

  • 它會根據僅允許 GETHEADPOST請求API的資源發出。

  • 如果它是 POST 方法請求,則必須包含 Origin 標頭。

  • 請求承載內容類型為 text/plainmultipart/form-dataapplication/x-www-form-urlencoded

  • 請求不包含自訂標頭。

  • 任何 Mozilla CORS 文件中列出的簡單請求 的其他要求。

對於簡單的跨來源 POST 方法請求,來自您資源的回應需要包含標頭 Access-Control-Allow-Origin: '*'Access-Control-Allow-Origin:'origin'

所有其他跨來源HTTP請求都是非簡單請求。

CORS 為非簡單請求啟用

如果 API的資源收到非簡單請求,您必須根據您的整合類型啟用其他CORS支援。

CORS 啟用非代理整合

對於這些整合,CORS通訊協定要求瀏覽器將飛行前請求傳送至伺服器,並等待伺服器核准 (或憑證請求),然後再傳送實際請求。您必須將 設定為API傳送適當的回應給飛行前請求。

若要建立預檢回應:

  1. 建立具有模擬整合的 OPTIONS 方法。

  2. 將下列回應標頭新增至 200 方法回應:

    • Access-Control-Allow-Headers

    • Access-Control-Allow-Methods

    • Access-Control-Allow-Origin

  3. 將整合傳遞行為設定為 NEVER。在這種情況下,未映射的內容類型的方法請求將被拒絕,並具有 HTTP 415 個不支援的媒體類型回應。如需詳細資訊,請參閱整合傳遞行為

  4. 輸入回應標頭的值。若要允許所有來源、所有方法和常見的標頭,請使用下列標頭值:

    • Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'

    • Access-Control-Allow-Methods: '*'

    • Access-Control-Allow-Origin: '*'

建立飛行前請求後,您必須針對至少所有 200 個回應,傳回所有CORS已啟用 方法的 Access-Control-Allow-Origin: '*'Access-Control-Allow-Origin:'origin'標頭。

使用 CORS啟用非代理整合 AWS Management Console

您可以使用 AWS Management Console 來啟用 CORS。API Gateway 會建立OPTIONS方法,並將Access-Control-Allow-Origin標頭新增至現有的方法整合回應。這並不總是有效的,有時您需要手動修改整合回應,才能針對至少所有 200 個回應傳回所有CORS已啟用 方法的Access-Control-Allow-Origin標頭。

啟用代理整合的CORS支援

對於 Lambda 代理整合或HTTP代理整合,您的後端負責傳回 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers標頭,因為代理整合不會傳回整合回應。

下列 Lambda 函數範例會傳回所需的CORS標頭:

Node.js
export const handler = async (event) => { const response = { statusCode: 200, headers: { "Access-Control-Allow-Headers" : "Content-Type", "Access-Control-Allow-Origin": "https://www.example.com", "Access-Control-Allow-Methods": "OPTIONS,POST,GET" }, body: JSON.stringify('Hello from Lambda!'), }; return response; };
Python 3
import json def lambda_handler(event, context): return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': 'https://www.example.com', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' }, 'body': json.dumps('Hello from Lambda!') }