2017-08-26 19 views
5

Tôi đã làm theo ví dụ từ here, bao gồm tệp swagger cho cấu hình CORS + SAM. Dường như tôi vẫn gặp lỗi CORS trừ khi tôi thêm tiêu đề CORS theo cách thủ công vào từng chức năng:Định cấu hình CORS cho Cổng API trong SAM/CloudFormation/Swagger

callback(null, { 
    statusCode: '200', 
    headers: { 
     'Access-Control-Allow-Origin': '*', 
     'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 
     'Access-Control-Allow-Methods': 'OPTIONS,GET,POST,PUT,PATCH,DELETE' 
    }, 
    body: JSON.stringify({message: "Hello world"}) 
}); 

Điều này có đúng không? Hay tôi đang làm gì sai?

+0

chỉ để xác nhận, mã ở trên phù hợp với bạn nhưng bạn chỉ muốn xác nhận đây là cách tốt nhất để đạt được điều này? – mostafazh

Trả lời

3

Tất cả tài liệu AWS đề xuất bạn cần chỉ định 3 tiêu đề đó trong mỗi tài nguyên API cổng và trả về mỗi câu trả lời hàm sẽ hỗ trợ CORS, bạn có thể thấy họ phải thêm 3 tiêu đề đó vào 2 điểm cuối API Gateway được xác định trong tệp swagger.yaml của dự án mẫu.

Mẫu Github bạn đề cập là sử dụng những gì được gọi là một proxy resource trong API Gateway, mà cơ bản là một API Gatewaty tuyến đường đó sẽ phù hợp với bất kỳ yêu cầu thực hiện cho các api và kích hoạt các chức năng Proxy lambda với Parth của yêu cầu, phương pháp ... vv Bạn có thể tìm hiểu thêm về cách hoạt động của nó here.

Bạn có mở để thử một cái gì đó như serverless có thể giúp bạn tổ chức tốt hơn các hàm lambda của bạn giống như SAM không. Nó cũng là support CORS.

0

Bạn cần phải bao gồm hai căn cứ để CORS làm việc vui vẻ (ví dụ với swaggerdoc/chrome)

Đối với mỗi con đường bạn đang xử lý:

  1. Có một phản ứng chỉ định tuỳ chọn phương pháp nào bạn xử lý
  2. Tiêu đề 'Access-Control-Allow-Origin' được trả lại theo phương thức thực tế của bạn, gọi

Tôi hiện đã tìm thấy giải pháp đơn giản nhất là: 1. Có phần OPTIONS xử lý bởi API GW nhạo báng 2. Tiêu đề bổ sung vào phản hồi không có chế giễu bởi API GW

Vì vậy, nếu bạn đang hỗ trợ một con đường "/ fred" với GET và POST:

 

     "/fred" { 
      "options": { 
      "consumes": [ 
       "application/json" 
      ], 
      "produces": [ 
       "application/json" 
      ], 
      "responses": { 
       "200": { 
       "description": "Success", 
       "schema": { 
        "$ref": "#/definitions/Empty" 
       }, 
       "headers": { 
        "Access-Control-Allow-Origin": { 
        "type": "string" 
        }, 
        "Access-Control-Allow-Methods": { 
        "type": "string" 
        }, 
        "Access-Control-Allow-Headers": { 
        "type": "string" 
        } 
       } 
       } 
      }, 
      "x-amazon-apigateway-integration": { 
       "responses": { 
       "default": { 
        "statusCode": "200", 
        "responseParameters": { 
        "method.response.header.Access-Control-Allow-Methods": "'GET,POST,OPTIONS'", 
        "method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'", 
        "method.response.header.Access-Control-Allow-Origin": "'*'" 
        } 
       } 
       }, 
       "requestTemplates": { 
       "application/json": "{\"statusCode\": 200}" 
       }, 
       "passthroughBehavior": "when_no_match", 
       "type": "mock" 
      } 
     } 

Sau đó, trong xử lý thực tế của bạn, bạn cần phải đảm bảo bạn có 'Access-Control-Allow-Origin' tiêu đề

 

    "post": { 
     "responses": { 
       "200": { 
       "description": "Success", 
       "schema": { 
        "$ref": "#/definitions/myrecord" 
       }, 
       "headers": { 
        "Access-Control-Allow-Origin": { 
        "type": "string" 
        } 
       }, 
     ..... 


     "x-amazon-apigateway-integration": { 
     "default": { 
        "statusCode": "200", 
        "responseParameters": { 
        "method.response.header.Access-Control-Allow-Origin": "'*'" 
        }, 
        "responseTemplates": { 
        "application/json": " ......" 
        } 
       } 

     ..... 

Lưu ý rằng bạn cần phải trả lại tiêu đề này trên báo xử lý lỗi vv cũng

0

Chúng tôi đã gặp sự cố tương tự khi chúng tôi đang sử dụng * trong Cho phép xuất xứ.

Không thể sử dụng ký tự đại diện trong Access-Control-Allow-Origin khi cờ thông tin xác thực là đúng.

Thay

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

Với địa chỉ yêu cầu của bạn, bạn đang yêu cầu từ,

'Access-Control-Allow-Origin': 'http://localhost:8000', 

hoặc bất cứ điều gì url của bạn.

Bạn cũng cần bao gồm số cổng cũng như trong tiêu đề trả lại của mình.Nó cũng bao gồm cả http hay https.

Nếu bạn muốn tự động hóa, hãy nhận url giới thiệu mà bạn có thể đưa vào danh sách trắng và chuyển giao thức, máy chủ, phần cổng của liên kết giới thiệu.

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan