Chia sẻ tài nguyên trên nhiều nguồn gốc [CORS] là một tính năng bảo mật của trình duyệt nhằm hạn chế các yêu cầu HTTP trên nhiều nguồn gốc được bắt đầu từ các tập lệnh đang chạy trong trình duyệt. Nếu tài nguyên API REST của bạn nhận được các yêu cầu HTTP có nguồn gốc chéo không đơn giản, bạn cần bật hỗ trợ CORS
Xác định xem có bật hỗ trợ CORS hay không
Yêu cầu HTTP có nguồn gốc chéo là yêu cầu được thực hiện để
Một miền khác [ví dụ: từ
5 đếnimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
6]import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Một miền phụ khác [ví dụ: từ
5 đếnimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
8]import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Một cổng khác [ví dụ: từ
5 đếnimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
0]import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Một giao thức khác [ví dụ: từ
1 đếnimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
2]import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
Các yêu cầu HTTP có nguồn gốc chéo có thể được chia thành hai loại. yêu cầu đơn giản và yêu cầu không đơn giản
Yêu cầu HTTP là đơn giản nếu tất cả các điều kiện sau đều đúng
Nó được phát hành đối với tài nguyên API chỉ cho phép các yêu cầu
0,import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
1 vàimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
2import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Nếu đó là một yêu cầu phương thức
2, nó phải bao gồm một tiêu đềimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
4import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Loại nội dung tải trọng yêu cầu là
5,import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
6 hoặcimport json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
7import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Yêu cầu không chứa tiêu đề tùy chỉnh
Bất kỳ yêu cầu bổ sung nào được liệt kê trong tài liệu Mozilla CORS cho các yêu cầu đơn giản
Đối với các yêu cầu phương thức
import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
2 có nguồn gốc chéo đơn giản, phản hồi từ tài nguyên của bạn cần bao gồm tiêu đề import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
9, trong đó giá trị của khóa tiêu đề được đặt thành import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
50[bất kỳ nguồn gốc nào] hoặc được đặt thành nguồn gốc được phép truy cập vào tài nguyên đóTất cả các yêu cầu HTTP có nguồn gốc chéo khác là các yêu cầu không đơn giản. Nếu tài nguyên API của bạn nhận được các yêu cầu không đơn giản, bạn cần bật hỗ trợ CORS
Ý nghĩa của việc kích hoạt hỗ trợ CORS
Khi trình duyệt nhận được yêu cầu HTTP không đơn giản, giao thức CORS yêu cầu trình duyệt gửi yêu cầu chạy trước tới máy chủ và chờ phê duyệt [hoặc yêu cầu thông tin xác thực] từ máy chủ trước khi gửi yêu cầu thực tế. Yêu cầu chiếu trước xuất hiện với API của bạn dưới dạng yêu cầu HTTP
Bao gồm một tiêu đề
4import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Sử dụng phương pháp
52import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }Bao gồm các tiêu đề sau
53import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
54import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
Do đó, để hỗ trợ CORS, tài nguyên API REST cần triển khai phương pháp
import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
52 có thể đáp ứng yêu cầu chiếu trước của import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
52 với ít nhất các tiêu đề phản hồi sau theo tiêu chuẩn Tìm nạp
57import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
58import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
9import json def lambda_handler[event, context]: return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '
Content-Type
', 'Access-Control-Allow-Origin': '//www.example.com
', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
' }, 'body': json.dumps['Hello from Lambda!'] }
Cách bạn bật hỗ trợ CORS tùy thuộc vào loại tích hợp API của bạn
Kích hoạt hỗ trợ CORS cho tích hợp giả
Đối với tích hợp mô phỏng, bạn kích hoạt CORS bằng cách tạo một phương thức
import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
52 để trả về các tiêu đề phản hồi bắt buộc [với các giá trị tĩnh thích hợp] làm tiêu đề phản hồi của phương thức. Ngoài ra, mỗi phương thức kích hoạt CORS thực tế cũng phải trả về tiêu đề import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
61' trong ít nhất 200 phản hồi của nó, trong đó giá trị của khóa tiêu đề được đặt thành import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
50 [bất kỳ nguồn gốc nào] hoặc được đặt thành nguồn gốc được phép truy cập Kích hoạt hỗ trợ CORS cho tích hợp không có proxy của Lambda hoặc HTTP và tích hợp dịch vụ AWS
Đối với tích hợp tùy chỉnh Lambda [không phải proxy], tích hợp tùy chỉnh HTTP [không phải proxy] hoặc tích hợp dịch vụ AWS, bạn có thể thiết lập các tiêu đề bắt buộc bằng cách sử dụng cài đặt phản hồi tích hợp và phản hồi của phương pháp Cổng API. Khi bạn bật CORS bằng cách sử dụng Bảng điều khiển quản lý AWS, API Gateway sẽ tạo một phương thức
import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
52 và cố gắng thêm tiêu đề import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
9 vào các phản hồi tích hợp phương thức hiện có của bạn. Điều này không phải lúc nào cũng hoạt động và đôi khi bạn cần sửa đổi phản hồi tích hợp theo cách thủ công để kích hoạt CORS đúng cách. Thông thường, điều này chỉ có nghĩa là sửa đổi phản hồi tích hợp theo cách thủ công để trả về tiêu đề import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
9Bật hỗ trợ CORS cho tích hợp proxy Lambda hoặc HTTP
Đối với tích hợp proxy Lambda hoặc tích hợp proxy HTTP, bạn vẫn có thể thiết lập tiêu đề phản hồi
import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
52 bắt buộc trong Cổng API. Tuy nhiên, chương trình phụ trợ của bạn chịu trách nhiệm trả về các tiêu đề import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
9 và import json
def lambda_handler[event, context]:
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type
',
'Access-Control-Allow-Origin': '//www.example.com
',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET
'
},
'body': json.dumps['Hello from Lambda!']
}
58 vì tích hợp proxy không trả về phản hồi tích hợp