Passport.js单路由多策略如何仅为SAML启用会话、禁用Basic认证会话
你遇到的现象本质原因是session中间件被全局挂载,所有请求都会触发会话创建逻辑,Passport的{ session: false }仅控制是否将用户信息存入会话,不会阻止session中间件本身生成会话Cookie和存储记录。
方案1:拆分session中间件挂载范围(最推荐)
取消session全局挂载,仅给需要SAML认证的路由(浏览器用户访问的路径、SAML回调端点等)挂载session相关中间件,/api路径完全不接触session逻辑:
- 移除原全局的
app.use(session(...))、app.use(passport.session())代码 - 给不同场景路由单独挂载对应中间件:
// SAML相关路由单独加session配置 app.use('/saml', session({/* 你原有session配置 */}), passport.session(), // 后续SAML路由逻辑 ) // 普通浏览器页面路由如果需要SAML认证,也单独加session中间件 app.use('/page', session({/* 你原有session配置 */}), passport.session(), // 后续页面路由逻辑 ) // /api路由不挂载session中间件,自然不会生成会话 app.use( "/api", tryTokenAuth, requireApiAuth, // 后续API路由逻辑 )
方案2:全局session中间件增加请求过滤
如果业务场景必须保留session全局挂载,可以给session中间件加判断,检测到Basic认证请求直接跳过:
// 改写原有全局session挂载逻辑 app.use((req, res, next) => { // 匹配Basic认证请求,跳过session处理 if (req.headers.authorization?.startsWith('Basic ')) { return next() } // 其他请求正常走session逻辑 session({ // 你原有的session配置 })(req, res, next) }) // passport.session也可以加同样的过滤,减少无用执行 app.use(passport.initialize()) app.use((req, res, next) => { if (req.headers.authorization?.startsWith('Basic ')) { return next() } passport.session()(req, res, next) })
补充校验
修改后可以验证:Basic认证请求的响应头不会出现Set-Cookie字段,数据库也不会生成对应的会话记录,同时SAML认证的流程不受任何影响。
内容的提问来源于stack exchange,提问作者alaney
相关产品推荐
相关产品推荐

