无服务器 AWS Lambda CORS 错误
Serverless AWS Lambda CORS Error
我正在尝试从 angularjs 应用向我使用无服务器设置的 lambda 函数发出 http 请求。
这是我的 serverless.yaml 函数
functions:
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors: true
创建客户函数
module.exports.createcustomer = (event, context, callback) => {
let customer = JSON.parse(event.body).customer;
service.create(customer, function(result) {
let response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Credentials": true,
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json",
},
body: JSON.stringify({
result: 'Created Customer Successfully',
message: 'The account has been created!',
type: 'success',
customer: result
})
};
callback(null, response);
});
};
在我的 AngularJS 应用程序中,我这样称呼它
app.factory('MyFactory', ['$http', function($http) {
return {
CreateCustomer: function(customer) {$http.post('<apipath>/createcustomer', {customer:customer})}
}
}]);
但是,我不断收到此错误:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5000' is therefore not allowed access. The response had HTTP status code 403.
我尝试在 API 网关中使用 POST 方法启用 CORS,但这并没有改变结果。
我也试过在 yaml 文件中显式设置 CORS
functions:
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors:
origin: '*'
仍然没有运气。
有人知道我做错了什么吗?
一件奇怪的事情是,我可以让 post 通过 PostMan 正常工作,但如果我通过我的应用程序尝试它,它就会崩溃。
谢谢
更新
当我执行 serverless deploy
时,它会像上图一样显示在 AWS 中,方法如下所示
正如我之前所说,我尝试直接从 API 网关控制台启用 CORS,但当我尝试调用该方法时没有任何区别。
这是可以提供帮助的配置。请注意,明确允许 CORS 来源始终是安全的。所以最好将源锁定到 localhost:{port-number}。此外,您还可以在 CORS 设置上启用凭据。请以以下无服务器配置为例:
cors:
origin: 'http://localhost:4200'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
allowCredentials: true
您更新的屏幕截图显示没有为这些资源中的任何一个设置 OPTIONS 方法。当您在控制台中为 API 网关资源启用 CORS 时,AWS 会自动进行设置。
当您为资源启用 CORS 时,您可以在 AWS 控制台中看到这种情况,但是,当然,您的 serverless deploy
正在覆盖此配置。
要通过无服务器部署在 AWS 中正确配置 /createcustomer
资源,您可以重写 serverless.yaml:
的这一部分
events:
- http: post /createcustomer
cors: true
看起来像这样:
events:
- http:
path: /createcustomer
method: post
cors: true
我不是框架的 .yml 语法方面的专家,所以我无法准确解释这是为什么。
尽管如此,我已经确认像这样的文件:
functions:
deletecustomer:
handler: handler.deletecustomer
events:
- http:
path: /deletecustomer
method: post
cors: true
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors: true
将在 AWS API 网关中创建两项资源,一项针对 CORS 正确配置,一项缺少 OPTIONS 方法:
我正在尝试从 angularjs 应用向我使用无服务器设置的 lambda 函数发出 http 请求。
这是我的 serverless.yaml 函数
functions:
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors: true
创建客户函数
module.exports.createcustomer = (event, context, callback) => {
let customer = JSON.parse(event.body).customer;
service.create(customer, function(result) {
let response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Credentials": true,
"Access-Control-Allow-Origin": "*",
"Content-Type": "application/json",
},
body: JSON.stringify({
result: 'Created Customer Successfully',
message: 'The account has been created!',
type: 'success',
customer: result
})
};
callback(null, response);
});
};
在我的 AngularJS 应用程序中,我这样称呼它
app.factory('MyFactory', ['$http', function($http) {
return {
CreateCustomer: function(customer) {$http.post('<apipath>/createcustomer', {customer:customer})}
}
}]);
但是,我不断收到此错误:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5000' is therefore not allowed access. The response had HTTP status code 403.
我尝试在 API 网关中使用 POST 方法启用 CORS,但这并没有改变结果。
我也试过在 yaml 文件中显式设置 CORS
functions:
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors:
origin: '*'
仍然没有运气。
有人知道我做错了什么吗?
一件奇怪的事情是,我可以让 post 通过 PostMan 正常工作,但如果我通过我的应用程序尝试它,它就会崩溃。
谢谢
更新
当我执行 serverless deploy
时,它会像上图一样显示在 AWS 中,方法如下所示
正如我之前所说,我尝试直接从 API 网关控制台启用 CORS,但当我尝试调用该方法时没有任何区别。
这是可以提供帮助的配置。请注意,明确允许 CORS 来源始终是安全的。所以最好将源锁定到 localhost:{port-number}。此外,您还可以在 CORS 设置上启用凭据。请以以下无服务器配置为例:
cors:
origin: 'http://localhost:4200'
headers:
- Content-Type
- X-Amz-Date
- Authorization
- X-Api-Key
- X-Amz-Security-Token
- X-Amz-User-Agent
allowCredentials: true
您更新的屏幕截图显示没有为这些资源中的任何一个设置 OPTIONS 方法。当您在控制台中为 API 网关资源启用 CORS 时,AWS 会自动进行设置。
当您为资源启用 CORS 时,您可以在 AWS 控制台中看到这种情况,但是,当然,您的 serverless deploy
正在覆盖此配置。
要通过无服务器部署在 AWS 中正确配置 /createcustomer
资源,您可以重写 serverless.yaml:
events:
- http: post /createcustomer
cors: true
看起来像这样:
events:
- http:
path: /createcustomer
method: post
cors: true
我不是框架的 .yml 语法方面的专家,所以我无法准确解释这是为什么。
尽管如此,我已经确认像这样的文件:
functions:
deletecustomer:
handler: handler.deletecustomer
events:
- http:
path: /deletecustomer
method: post
cors: true
createcustomer:
handler: handler.createcustomer
events:
- http: post /createcustomer
cors: true
将在 AWS API 网关中创建两项资源,一项针对 CORS 正确配置,一项缺少 OPTIONS 方法: