【问题标题】:HapiJS - what do I need to do to get CORS working here?HapiJS - 我需要做什么才能让 CORS 在这里工作?
【发布时间】:2019-11-15 19:13:38
【问题描述】:

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

我想像这样提供一个标头,我知道我需要以I outlined in the spec from the W3C 接受 XHR 调用

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 时,我看不到 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 响应中的资源表示。某些类型的资源不应尝试指定特定的授权来源,而是拒绝或允许所有来源。

  1. 对其他来源的应用程序无用的资源(例如登录页面)不应返回 Access-Control-Allow-Origin 标头。资源仍然必须保护自己免受 CSRF 攻击,例如要求在请求的明确提供的内容中包含不可猜测的令牌。此类资源的安全属性不受符合本规范的用户代理的影响。

  2. 可公开访问且无需访问控制检查的资源始终可以安全地返回值为“*”的 Access-Control-Allow-Origin 标头。

  3. 如果没有敏感的 cmets,因为可以使用HTML 脚本元素。如果需要,这些资源可以实现如上所述的访问控制和 CSRF 保护。

我的用例 - 让任何人都可以访问端点,而不需要任何 authz/authn 似乎满足案例 2。

我还需要做什么?

【问题讨论】:

  • 究竟在什么情况下服务器响应不包含 Access-Control-Allow-Origin 响应标头?具体来说,您的意思是在某些情况下,当您使用 XHR 从浏览器中运行的前端 JavaScript 代码发出请求时,它不会?还是您的意思是,当您使用前端 JavaScript 代码以外的内容发出请求时,响应不包含 Access-Control-Allow-Origin 响应标头?
  • 至于 “你不应该在每个请求中传递 'Origin' 标头”,对于从运行的前端 JavaScript 代码发出的跨域请求在浏览器中,您无法控制是否将 Origin 标头添加到请求中。相反,它总是被添加——因为浏览器会自动将 Origin 添加到每个跨域请求中。
  • 对于浏览器以外的其他工具,无论是否发送Origin请求头,服务器响应是否包含Access-Control-Allow-Origin都无关紧要响应头——因为这些工具不受同源策略的影响,所以它们根本不需要 CORS 协议。
  • 在这种情况下,当我发出 XHR 请求时,无论我发送什么,我都不会在我的请求中获得 CORS 标头。我现在已经找到了如何提供这些服务(我已经在答案中添加了它)我并不完全高兴,因为它依赖于忽略这些值,但是现在,它会做这个副项目。 github.com/mrchrisadams/flight-o-tron/blob/master/functions/…

标签: cors hapijs


【解决方案1】:

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

所以,我必须像这样添加到服务器声明中,然后将其从路由中删除:

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

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

【讨论】:

  • 谢谢你!我正在寻找如何做到这一点。这对我有用:routes: { cors: { origin: "ignore" } } 如果我使用 '*' 它不起作用。我正在使用 hapijs 的 17 版
  • routes: { cors: { origin: ["*"] } } 为我工作!谢谢
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 2017-12-22
  • 2017-08-14
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
相关资源
最近更新 更多