HapiJS-我需要做什么才能让CORS在这里工作?

HapiJS-我需要做什么才能让CORS在这里工作?,cors,hapijs,Cors,Hapijs,我试图理解我在这个使用hapiJS发送CORS头的基本示例中犯了什么错误,它允许我从另一个应用程序进行XHR调用 我希望像这样提供一个标头,我知道我需要将XHR调用作为 当我检查时,我知道我需要向路由对象添加CORS密钥,如下所示: const Hapi = require('@hapi/hapi'); const init = async () => { const server = Hapi.server({ port: 3000, h

我试图理解我在这个使用hapiJS发送CORS头的基本示例中犯了什么错误,它允许我从另一个应用程序进行XHR调用

我希望像这样提供一个标头,我知道我需要将XHR调用作为

当我检查时,我知道我需要向路由对象添加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()
问题是,当我传入一个
cors:true
时,或者当我传入一个更充实的对象时,我都看不到Access Control Allow Origin头:

{
origin: ['*'],
maxAge: 86400,
headers: ['Accept', 'Authorization', 'Content-Type', 'If-None-Match'],
exposedHeaders: ['WWW-Authenticate', 'Server-Authorization'],
credentials: true
}
我缺少什么来让CORS支持在这里工作

在我阅读规范时,您不需要在每个请求中都传递“Origin”头-这是一个取决于您公开的资源的决定

此规范定义了如何授权在用户代理中执行的来自外部来源的应用程序实例访问HTTP响应中的资源表示。某些类型的资源不应尝试指定特定的授权来源,而应拒绝或允许所有来源

  • 对于来自其他来源(如登录页)的应用程序不有用的资源,不应返回访问控制允许来源标头。资源仍然必须保护自己免受CSRF攻击,例如要求在请求的显式提供的内容中包含不可用的令牌。此类资源的安全属性不受符合本规范的用户代理的影响

  • 可公开访问的资源(无需访问控制检查)始终可以安全地返回值为“*”的访问控制允许源标题

  • 如果GET响应的实体体恰好作为ECMAScript进行解析,则只要没有敏感注释,就可以返回值为“*”的Access Control Allow Origin标头,因为它可以使用HTML脚本元素跨源访问。如果需要,这些资源可以实现如上所述的访问控制和CSRF保护

  • 我的用例——让任何人都可以访问一个端点,而不需要任何authz/authn,这似乎满足了用例2的要求


    我还需要做什么?

    好的,我的解决方案是在服务器上添加cors信息,而不是路由

    因此,我必须像这样添加到服务器声明中,并将其从路由中删除:

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

    我仍然不确定如何在每个路由的基础上实现这一点,这是我的首选设置,但这在目前是有效的。

    确切地说,在什么情况下,服务器响应不包括Access Control Allow Origin响应头?具体地说,您的意思是,在某些情况下,当您使用浏览器中运行的前端JavaScript代码中的XHR发出请求时,不会发生这种情况吗?或者,您的意思是,当您使用前端JavaScript代码以外的其他代码发出请求时,响应不包括Access Control Allow Origin response标头吗?只要“您不需要在每个请求中传递'Origin'标头”,对于在浏览器中运行的前端JavaScript代码发出的跨源请求,您无法控制是否将源标头添加到请求中。相反,它总是被添加,因为浏览器会自动将源代码添加到每个跨源代码请求中。对于浏览器以外的工具,无论它们是否发送源代码请求标头,服务器响应是否包含Access Control Allow Origin response标头并不重要,因为这些工具不受同一来源策略的影响,因此它们根本不需要CORS协议。在这里,当我发出XHR请求时,无论我发送了什么,我不会在我的请求中得到CORS头。我现在已经发现了如何为这些服务(我在答案中添加了它),我并不完全高兴,因为它依赖于忽略这些值,但现在,这一方面的项目就可以了。谢谢你,伙计!我在看这是怎么做的。这对我有效:
    routes:{cors:{origin:{ignore}}
    如果我使用“*”它就不起作用。我使用的是hapijs
    routes:{cors:{origin:[“*”]}}
    的第17版,它对我有用!谢谢
    const server = Hapi.server({
        debug: { request: ["*"], log: ["*"] },
        port: 3000,
        host: "localhost",
        routes: { cors: { origin: "ignore" } }
        // this also worked
        routes: { cors: { origin: ["*"] } }
    })