HapiJS-如何使CORS在这里工作?

时间:2019-07-05 07:11:35

标签: cors hapijs

我试图了解使用hapiJS发送CORS标头的基本示例在做错什么,使我可以从另一个应用程序进行XHR调用。

我想像这样存储标头,我知道我需要接受XHR调用为I outlined in the spec from the W3C

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

当我检查the HapiJS docs on CORS support时,我了解到我需要向路由对象添加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时,或者当我这样充实的对象时,都没有看到“访问控制允许起源”标头:

{
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.   
  3. 可被公共访问的资源,无需访问控制检查,可以始终安全地返回值为“ *”的Access-Control-Allow-Origin标头。

  4.   
  5. 一个GET响应,它的实体主体恰好是ECMAScript进行解析的,因此如果没有敏感的注释,因为它可以使用HTML脚本元素。如果需要,这样的资源可以实现如上所述的访问控制和CSRF保护。

  6.   

我的用例-无需任何authz / authn就可以使任何人都可以访问端点,这似乎可以满足用例2。

我还需要做什么?

1 个答案:

答案 0 :(得分:0)

好的,对我来说,解决方法是在服务器上添加cors信息,而不是路由。

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

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

我仍然不确定如何在每条路线上进行此操作,这是我的首选设置,但这暂时可行。