AWS API Gateway - 具有特定域

时间:2018-03-17 00:25:02

标签: cors aws-lambda aws-api-gateway access-control

我有一个与启用了CORS的API网关集成的Lambda函数。我正在使用LAMBDA_PROXY集成,所以我知道我必须在Lambda函数的响应中指定Access-Control-Allow-Origin标头。但是,我只想允许来自特定域(www.example.com)的跨资源共享。

Lambda函数 -

'use strict'
module.exports.handler = (event, context, callback) => {
  const response = {
    statusCode: 200,
    headers: {
      "Access-Control-Allow-Origin": "https://www.example.com"
    },
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!'
    }),
  };

  callback(null, response);
};

当我执行测试GET请求(来自API网关控制台)时,它会返回一个成功的(200)响应。我希望因为我从AWS Api网关控制台调用端点而不是https://www.example.com端点应该返回非200状态代码。

我可以在回复中看到Access-Control-Allow-Origin标题 - enter image description here

如果我的原始域名不是https://www.example.com,为什么我会获得200状态代码?

此外,我尝试从S3中的网站静态托管网站进行Ajax调用。我仍然得到200响应和JSON数据,即使我显然没有从www.example.com拨打电话。

修改

我最终重新创建资源只是为了向这个问题添加一个实例。

当我直接点击API端点时,它允许我返回JSON数据(我使用的是Google Chrome 64.0.3282.186和FireFox 58.0.2)。

https://w69y8dk663.execute-api.us-east-1.amazonaws.com/dev/api/status

但是,当我从静态托管的s3网站发出Ajax请求时,我收到错误。

http://test-cors-ajax.s3-website-us-east-1.amazonaws.com/

我昨天测试了ajax并且它让我得到了JSON数据,某些东西必须在某处缓存(运行没有allow-access-origin头的旧代码)。无论如何,它看起来像预期的那样运作。

我觉得有趣的是我的浏览器让我直接点击端点而不会抛出CORS错误。感谢您的投入。

1 个答案:

答案 0 :(得分:2)

CORS不是用于控制服务器行为的机制;这是为了告诉浏览器如何表现。

请求将成功(即返回200),但同源策略将阻止外部站点读取响应,除非有CORS指令允许它。