Node/Express的Passport认证中间件如何全局保护所有API路由
全局Express API路由Passport认证失效解决方案
常见失效原因
- 入口全局挂载方案失效:90%以上是中间件挂载顺序错误,要么是
passport.initialize()初始化放在了认证中间件之后,要么是认证中间件挂载在了业务路由之后,导致路由匹配时没有走到认证逻辑。 - 路由模块内
router.all('*')方案失效:是因为具体业务路由的定义放在了router.all之前,Express按顺序匹配路由,请求命中具体路由后就不会再执行后面的router.all逻辑,所以只匹配到了根路径。
可行实现方案
方案1:入口文件全局挂载(推荐,无需修改各路由模块)
严格按照下方中间件顺序调整src/index.js代码即可:
const express = require('express'); const passport = require('passport'); const app = express(); // 第一步:挂载基础通用中间件 app.use(express.json()); // 其他基础中间件如cors、日志中间件等也放在这一步 // 第二步:初始化Passport(必须放在认证中间件之前,且提前完成BearerStrategy的配置) app.use(passport.initialize()); // 第三步:全局挂载认证中间件,匹配所有/api前缀的路由 app.use('/api', passport.authenticate('oauth-bearer', { session: false })); // 第四步:最后挂载所有业务路由,自动继承上层认证规则 app.use('/api/v1/users', require('./routers/users')); app.use('/api/v1/actions', require('./routers/actions')); // 其余业务路由统一在此处挂载
如果存在不需要认证的公开路由(如健康检查接口),将公开路由的挂载放在第三步认证中间件之前即可。
方案2:路由模块内单独配置
如果需要各路由模块自主控制是否开启认证,调整每个路由模块的代码顺序,将router.all放在所有具体路由定义的最前面:
// src/routers/users.js 示例代码 const express = require('express'); const router = express.Router(); const passport = require('passport'); // 所有路由定义前优先写全局匹配规则 router.all('*', passport.authenticate('oauth-bearer', { session: false })); // 后续写具体业务路由,根路径、子路径都会触发前面的认证逻辑 router.get('/', (req, res) => { // 业务逻辑 }); router.get('/relationships', (req, res) => { // 业务逻辑 }); router.post('/', (req, res) => { // 业务逻辑 }); module.exports = router;
异常排查点
如果按上述方案配置后仍不生效,优先检查两项内容:
- 确认
passport-azure-ad的BearerStrategy配置正确,客户端ID、租户ID、受众等参数和前端请求的Token签发参数匹配 - 确认前端请求的
Authorization请求头格式为Bearer <实际token>,无拼写错误、空格缺失等问题
内容的提问来源于stack exchange,提问作者nubianMONK
相关产品推荐
相关产品推荐

