我试图了解使用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响应中的资源表示。某些类型的资源不应尝试指定特定的授权来源,而应拒绝或允许所有来源。
对其他来源的应用程序无用的资源(例如登录页面),不应返回Access-Control-Allow-Origin标头。资源仍然必须保护自己免受CSRF攻击,例如要求在显式提供的请求内容中包含不可猜测的令牌。此类资源的安全属性不受符合此规范的用户代理的影响。
可被公共访问的资源,无需访问控制检查,可以始终安全地返回值为“ *”的Access-Control-Allow-Origin标头。
一个GET响应,它的实体主体恰好是ECMAScript进行解析的,因此如果没有敏感的注释,因为它可以使用HTML脚本元素。如果需要,这样的资源可以实现如上所述的访问控制和CSRF保护。
我的用例-无需任何authz / authn就可以使任何人都可以访问端点,这似乎可以满足用例2。
我还需要做什么?
答案 0 :(得分:0)
好的,对我来说,解决方法是在服务器上添加cors信息,而不是路由。
因此,我必须像这样添加到服务器声明中,并将其从路由中删除:
const server = Hapi.server({
debug: { request: ["*"], log: ["*"] },
port: 3000,
host: "localhost",
routes: { cors: { origin: "ignore" } }
// this also worked
routes: { cors: { origin: ["*"] } }
})
我仍然不确定如何在每条路线上进行此操作,这是我的首选设置,但这暂时可行。