HapiJS - что мне нужно сделать, чтобы CORS работал здесь? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь понять, что я делаю неправильно для этого базового примера использования hapiJS для отправки заголовков CORS, что позволяет мне делать вызовы XHR из другого приложения.

Я хочу создать такой заголовок на сервереЯ понимаю, что мне нужно будет принимать вызовы XHR как , которые я описал в спецификации от W3C

Access-Control-Allow-Origin: ["*"]

Когда я проверяю документы HapiJS по поддержке CORS , Я понимаю, что мне нужно добавить ключ CORS к объекту маршрутизации следующим образом:

const Hapi = require('@hapi/hapi');

const init = async () => {


  const server = Hapi.server({
          port: 3000,
          host: 'localhost',
  });


  server.route({
          method: 'GET',
          path:'/',
          handler: (request, h) => {

              console.log('CORS request.info:');
              console.log(request.info.cors);
              return 'Hello world! Shis should be sending a CORS header.';
          },
          options: {
            cors: true
          }

  });

  await server.start();
  console.log('Server running on %s', server.info.uri);
})
init()

Дело в том, что я не вижу заголовок Access Control Allow Origin, когда я передаю cors:true ни когда я передаю более конкретный объект, подобный этому:

{
origin: ['*'],
maxAge: 86400,
headers: ['Accept', 'Authorization', 'Content-Type', 'If-None-Match'],
exposedHeaders: ['WWW-Authenticate', 'Server-Authorization'],
credentials: true
}

Чего мне не хватает, чтобы здесь работала поддержка CORS?

Когда я читаю спецификацию, вы не должныНе нужно передавать заголовок «Origin» в каждом запросе - это решение, которое вы должны принять в зависимости от ресурса, который вы выставляете

Эта спецификация определяет, как авторизовать экземпляр приложения изиностранного происхождения, исполняющийв пользовательском агенте, чтобы получить доступ к представлению ресурса в ответе HTTP.Определенные типы ресурсов не должны пытаться указывать определенные разрешенные источники, но вместо этого либо запрещать, либо разрешать все источники.

  1. Ресурс, который не полезен для приложений из других источников, таких как имя входастраница не должна возвращать заголовок Access-Control-Allow-Origin.Ресурс по-прежнему должен защищать себя от атак CSRF, например, требуя включения неопровержимого токена в явно предоставленное содержимое запроса.На свойства безопасности таких ресурсов не влияют агенты пользователей, соответствующие данной спецификации.

  2. Общедоступный ресурс, без проверок контроля доступа, всегда может безопасно вернуть Access-Control-Allow-Origin заголовок, значение которого "*".

  3. GET-ответ, тело объекта которого анализируется как ECMAScript, может вернуть заголовок Access-Control-Allow-Origin, значение которого равно "* "при условии, что нет чувствительных комментариев, так как к ним можно получить перекрестное происхождение, используя элемент скрипта HTML.При необходимости такие ресурсы могут реализовывать управление доступом и защиту CSRF, как описано выше.

Мой вариант использования - создание конечной точки, доступной для всех, без необходимости выполнения authz / authn, похоже, удовлетворяет случаю 2.

Что еще мне нужноделать?

1 Ответ

0 голосов
/ 05 июля 2019

Хорошо, я решил добавить информацию о cors на сервере, а не маршрут.

Итак, мне пришлось добавить к объявлению сервера вот так, и удалить его из маршрута:

const server = Hapi.server({
    debug: { request: ["*"], log: ["*"] },
    port: 3000,
    host: "localhost",
    routes: { cors: { origin: "ignore" } }
    // this also worked
    routes: { cors: { origin: ["*"] } }
})

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

...