Выполнить предварительный запрос CORS с учетными данными - PullRequest
0 голосов
/ 22 мая 2018

Я использую безсерверный шаблон 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),
    })

Я обрабатываю заголовки ответа в моей лямбде следующим образом:

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 : Ответ на предварительный запрос не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».Происхождение 'https://direct.company.com' поэтому не разрешено.Ответ имеет HTTP-код состояния 403. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

1 Ответ

0 голосов
/ 07 февраля 2019

Добавьте дополнительную конечную точку к той же лямбде, которая обрабатывает запрос на публикацию.

Примерно так: serverless.yml

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

Вы можете добавить свои источники в список разрешенных источников

export const options = async (event, context, callback) => {
  const ALLOWED_ORIGINS = [
    'http://localhost:3001',
  ]

  const origin = event.headers.origin || event.headers.Origin
  let response

  if (ALLOWED_ORIGINS.includes(origin)) {
    response = {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Allow-Origin': origin,
        'Access-Control-Allow-Credentials': true,
      },
      body: JSON.stringify({ message: 'Success' }),
    }
  } else {
    response = {
      statusCode: 403,
      headers: {
        'Access-Control-Allow-Origin': '*',
      },
      body: JSON.stringify({ message: {
        error: 'Missing Authentication token',
        origin: `Request origin is ${origin}`,
      },
      }),
    }
  }

  callback(null, response)
  return
}

Теперь, когда запрос опций сделан браузером, тогда этот метод мы обрабатываем и возвращаем 200, если это из разрешенного источника или из-за ошибки.Вы можете настроить сообщение об ошибке в соответствии с вашими потребностями.

...