当前位置: 首页 > news >正文

Node.js Express 中间件鉴权漏掉部分路由导致 403 Forbidden 怎么办?

Node.js Express 中间件鉴权配置不当导致部分路由 403 Forbidden 怎么办?

直接检查中间件挂载顺序和路由路径匹配,通常是因为鉴权中间件被错误地应用到了本应公开的路由,或者请求头处理不当导致验证失败。

先说结论:问题多出在中间件执行顺序、路由挂载路径不一致或请求头大小写处理上。

  • 先确认中间件注册顺序
  • 先处理路由挂载路径匹配
  • 再验证请求头大小写规范

核心原因分析

Express 按注册顺序执行中间件。如果鉴权中间件注册在所有路由之前且没有排除逻辑,所有请求都会被拦截。此外,Express 会自动将 HTTP 请求头名称转换为小写,如果代码中尝试获取 Authorization 而非 authorization,会导致无法读取 Token 从而返回 403。

解决方案一:调整中间件注册顺序

确保公开路由(如登录、注册)在鉴权中间件之前注册。

// 检查 app.js 或入口文件中的中间件顺序
app.use('/api/login', loginRouter);   // 公开路由在前
app.use('/api', authMiddleware);      // 鉴权中间件在后
app.use('/api', protectedRouter);     // 受保护路由

解决方案二:完善中间件内部路径排除逻辑(推荐)

仅调整顺序可能无法解决复杂路由结构下的鉴权冲突,建议在中间件内部实现路径白名单。

const authMiddleware = (req, res, next) => {// 白名单路径,无需鉴权const publicPaths = ['/api/login', '/api/register', '/api/public'];if (publicPaths.some(path => req.path.startsWith(path))) {return next();}// 获取请求头,Express 会自动转小写const authHeader = req.headers.authorization;if (!authHeader || !authHeader.startsWith('Bearer ')) {return res.status(403).json({ error: 'Unauthorized' });}const token = authHeader.split(' ')[1];// 此处添加 token 验证逻辑// verifyToken(token)...next();
};

请求头大小写处理

在中间件中使用 req.headers.authorization 而不是 req.headers['Authorization'],因为 Express 会将头名称转为小写。

验证方法

使用 curl 命令测试受保护接口:

curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:3000/api/protected

观察是否返回 200 而非 403。同时检查服务器日志,确认中间件是否按预期跳过或通过了验证。

常见坑与排查

  • 请求头大小写:客户端发送 Authorization,服务端必须用 authorization 读取。
  • 路由前缀 mismatch:app.use('/list', router) 意味着内部路由 / 对应外部 /list,而非根路径。
  • 中间件顺序:app.use(auth) 放在 app.use(routes) 之后会导致鉴权不生效,放在之前且无排除逻辑会导致公开接口 403。
  • 复杂路由结构:如果路由分散在不同文件,仅靠顺序难以管理,务必使用中间件内部路径判断。

参考文档

  • Express 官方文档:Using Middleware
  • MDN Web Docs: HTTP Headers

原文链接:https://www.zjcp.cc/ask/11373.html

http://www.rkmt.cn/news/1305916.html

相关文章:

  • Tlias教学管理系统项目实战
  • 2026年电锅炉厂家/电节能导热油炉厂家/电加热设备厂家排行 - 速递信息
  • 20026年5月永城黄金回收多少钱一克实时行情回收避坑指南 - 速递信息
  • 重庆:报考中质协六西格玛黑带和绿带指定报考机构推荐 - 众智商学院课程中心
  • 利用Cursor编写工业WebScad-005创建历史查询界面
  • AI Agent 的生产力悖论
  • 2026淄博烧烤深度测评:牧羊村、三昧真火、小滋博,到底哪家值得吃? - 速递信息
  • Java 流程编排新范式 Solon Flow:一个引擎,七种节点,覆盖规则/任务/工作流/AI 编排全场景
  • 大一Java第六周学习总结:封装与继承
  • 陷车清零效率提升58%:非标履带底盘案例解析 - 速递信息
  • 500以内送礼高跟鞋排行:玫瑰米兰达领衔实用之选 - 奔跑123
  • 2026年新疆旅行社行业深度攻略:从选型到落地全流程指南 - 速递信息
  • 2026农村光伏发电租赁屋顶安装推荐:河南区域品牌测评,本土标杆脱颖而出 - 速递信息
  • 2026年新疆旅行社选型指南白皮书 - 速递信息
  • 2026年武汉搏击馆真实测评:内行人揭秘挑选标准与避坑指南 - 速递信息
  • 飞机载重平衡与货物管理系统三次作业集总结
  • vulnhub:Noob: 1(拿下的第一台靶机)
  • 2026年钢格板厂家:解读行业三大核心趋势 - 速递信息
  • CUDA 零基础入门(一):从 CPU/GPU 到 Kernel、Thread、Block、Grid
  • 单次盈利赚回跑车:红酒轻创业真实案例解析 - 速递信息
  • 快米兔 GEO vs 艾奇 GEO:纯 AI 优化与 AI+SEO 双引擎的优劣对比 - 速递信息
  • AScript如何实现LINQ语法
  • 快手去水印怎么操作?快手视频如何在线去除水印?2026 在线工具实测推荐 - 科技热点发布
  • 2026年砌块工厂深度选型指南:如何为工程采购匹配最佳方案? - 速递信息
  • 泉州丰泽开锁哪家靠谱|李氏开锁24小时上门,公安备案同城就近派单(2026最新) - 速递信息
  • 微服务间 Feign 调用传递 Token 丢失导致 401 未授权怎么解决?
  • 2026 iOS/安卓手机免费去水印App推荐|一键去除视频图片水印的软件测评 - 科技热点发布
  • 钢格板厂家常见问题解答(2026最新专家版) - 速递信息
  • 快手视频怎样去水印?2026 快手去水印在线工具与视频解析提取方法实测 - 科技热点发布
  • 2026年工程采购必读:靠谱钢格板厂家怎么选?恺嵘丝网给出国标品质方案 - 速递信息