使用凭据发出CORS预检请求

时间:2018-05-22 03:47:26

标签: lambda cors aws-api-gateway serverless

我使用无服务器的yml模板将我的功能部署到aws。以下代码段显示了其中一个端点的配置

functions:
  publish:
    handler: lambda.publish
    events:
      - http:
          method: post
          path: publish
          cors:
            origin: ${self:custom.origin.${self:custom.stage}}
            allowCredentials: true

这是我的获取请求,

fetch(`${SOME_DOMAIN}/publish`, {
      method: 'POST',
      credentials: 'include',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    })

我正在处理我的lambda中的响应头,就像这样,

const ALLOWED_ORIGINS = [
  'http://localhost:3001',
  'https://staging.company.com.au',
  'https://blaze-staging.company.com.au',
  'https://www.company.com.au',
  'https://blaze.company.com.au',
  'https://direct.company.com.au',
]

const origin = event.headers.origin
let headers

if (ALLOWED_ORIGINS.includes(origin)) {
  headers = {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': origin,
    'Access-Control-Allow-Credentials': true,
  }
} else {
  headers = {
    'Access-Control-Allow-Origin': 'http://localhost:3001',
  }
}

const response = {
  statusCode: 200,
  headers,
  body: JSON.stringify({ message: 'Successfully published the message.' }),
}

callback(null, response)

由于无法设置多个来源,我无法获得飞行前的请求。如何解决这个问题?设置mode: 'no-cors' 在请求上实际上允许来自任何域的请求。非常感谢任何帮助。

飞行前请求将显示以下错误:

  

无法加载https://o9a0130i2r.execute-api.us-east-1.amazonaws.com/development/publish:   对预检请求的响应没有通过访问控制检查:否   '访问控制允许来源'标题出现在请求的上   资源。起源' https://direct.company.com'因此是不允许的   访问。响应具有HTTP状态代码403.如果是不透明的响应   满足您的需求,将请求模式设置为“无人”状态。去取   CORS禁用的资源。

1 个答案:

答案 0 :(得分:1)

将另一个端点添加到处理发布请求的同一lambda。

cumsum

这样的事情
serverless.yml

您可以将您的起源添加到允许的起源列表中

  options:
    handler: lambda.options
    events:
      - http:
          method: options
          path: publish

现在,当浏览器发出选项请求时,此方法将处理它,如果来自允许的来源或错误,则返回200。您可以根据需要自定义错误消息。