【发布时间】:2019-02-22 13:58:01
【问题描述】:
我有一个已部署的 Web 应用程序,它使用托管在 S3 上的 React 和 Redux 前端构建,以及托管在 AWS Lambda 上并通过 API Gateway 公开的多个后端微服务,这些微服务是使用 Serverless 部署的。该网站还通过 CloudFront CDN 分发。
微服务与多个外部服务交互,但我关心的主要服务是 get-products 服务,它查询 Stripe 产品数据库并将产品从那里返回到我的 React 应用程序。
网站一直运行良好,直到昨天我为前端部署了一些新的(基本上是装饰性的)更改,并向 Stripe 数据库添加了更多 SKU。自从添加这些更改后,我开始遇到以前没有的 CORS 错误。
最初我收到以下错误:
Access to XMLHttpRequest at 'https://XXXXXXXXXX.execute-api.eu-west-1.amazonaws.com/dev/products' from origin 'https://www.superfunwebsite.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
尽管我的 Lambda 响应包含以下标题:
'Access-Control-Allow-Origin': '*',
此时,我将 Lambdas 响应标头更新为以下内容:
'Access-Control-Allow-Origin': 'https://www.superfunwebsite.com/',
'Access-Control-Allow-Credentials': true
该错误基本上一直存在,除了在一个随机页面加载时,我收到一个错误,指出 Origin https://www.superfunwebsite.com 和 'Access-Control-Allow-Origin' https://www.superfunwebsite.com/ 不匹配。
我已经将 Lambda 响应标头更改为:
'Access-Control-Allow-Origin': 'https://www.superfunwebsite.com',
'Access-Control-Allow-Credentials': true
这似乎已经解决了异常的第二个错误。
但是,即使我使用 Insomnia 等 HTTP 客户端进行测试,错误仍然存在。我在响应中得到以下内容。
// status code
403
// response
{
"message": "Forbidden"
}
// headers
Content-Type: application/json
Content-Length: 23
Connection: keep-alive
Date: Tue, 18 Sep 2018 13:22:41 GMT
x-amzn-RequestId: eb691541-bb45-11e8-82ff-6d1b542dffb9
x-amzn-ErrorType: ForbiddenException
x-amz-apigw-id: NaxVLGJgjoEF5Fg=
X-Cache: Error from cloudfront
Via: 1.1 08037e15a3c6f503f39825efeb7f0210.cloudfront.net (CloudFront)
X-Amz-Cf-Id: cbNtb4xKWc48VPFon-Cl9y27KmXRVLIN5SWuYwNWlWsTXeaAXx3z-Q==
根据上面的 Insomnia 输出,我的问题似乎与 CloudFront 有某种关系,尽管我不明白具体如何。 This other S/O post 似乎表明 CloudFront 行为部分中应该有适合我的选项,允许我将响应的标头列入白名单,但是这些选项在控制台中对我不可见,我看到了建议,这是因为来源在 S3。
我的问题很简单,是否有人知道我可以如何解决此问题,或者是否还有其他我认为不应该考虑的东西?
【问题讨论】:
-
更新 - 我现在还使用 API Gateway 控制台的测试功能对此进行了测试。此处响应成功返回,正确的标头完好无损: Access-Control-Allow-Origin: superfunwebsite.com
标签: amazon-web-services cors aws-lambda aws-api-gateway amazon-cloudfront