Hapi v21.2.2服务器CORS报错:Request header field authorization不被允许
问题核心是:浏览器预请求(OPTIONS)返回的Access-Control-Allow-Headers响应头未包含Authorization,导致浏览器拦截后续带该头的请求。即使OPTIONS返回204状态码,只要头不匹配就会触发CORS报错。
全局CORS配置(推荐)
在服务器初始化时显式配置允许Authorization头:
import Hapi from '@hapi/hapi'; const init = async () => { const server = Hapi.server({ port: 3000, host: 'localhost', routes: { cors: { origin: ['https://your-frontend-domain.com'], // 替换为实际前端域名,带凭证场景不要用* headers: ['Authorization', 'Content-Type'], // 必须显式包含Authorization credentials: true, // 请求带凭证(如Authorization、cookie)时需开启 exposedHeaders: ['Authorization'] // 前端需要读取响应中的Authorization头时添加 } } }); // 示例受保护路由 server.route({ method: 'GET', path: '/api/protected', handler: (req, h) => { return { status: 'ok', user: req.auth.credentials }; } }); await server.start(); console.log('Server running at:', server.info.uri); }; process.on('unhandledRejection', err => { console.error(err); process.exit(1); }); init();
路由级单独配置
仅需给特定路由开启跨域支持时使用:
server.route({ method: 'POST', path: '/api/auth', handler: (req, h) => { return { token: 'generated-token' }; }, options: { cors: { origin: ['https://your-frontend-domain.com'], headers: ['Authorization', 'Content-Type'], credentials: true } } });
验证配置是否生效
用curl模拟预请求,检查响应头:
curl -X OPTIONS -H "Access-Control-Request-Headers: authorization" http://localhost:3000/api/protected -v
确保响应中存在Access-Control-Allow-Headers: Authorization, Content-Type。
注意事项
- 带凭证的请求不能用
origin: ['*'],必须指定具体前端域名,否则浏览器会拒绝 - 若使用Hapi认证插件(如@hapi/jwt),确保插件逻辑不会覆盖CORS响应头
- 服务器有反向代理(如Nginx)时,需确保代理也正确传递CORS相关头
内容的提问来源于stack exchange,提问作者bbnn
相关产品推荐
相关产品推荐

