Node.js中如何配置Passport使其读取req.body而非req.query完成身份验证
解决方案
- 第一步:配置Express请求体解析中间件
Passport-local默认优先从req.body读取身份验证字段,你没有配置请求体解析中间件时req.body为空,所以会自动 fallback 到req.query读取参数。
Express 4.16.0及以上版本内置了请求体解析能力,直接在路由初始化代码最前方(早于Passport初始化和路由定义)注册中间件即可:
// 解析JSON格式的请求体,适配前后端分离的JSON传参场景 router.use(express.json()) // 解析表单提交格式的请求体,适配form表单提交场景 router.use(express.urlencoded({ extended: false }))
- 第二步:校验字段名匹配
你当前LocalStrategy中配置的usernameField:"email"、passwordField:"password",需要和前端POST请求body中的字段名完全对应,比如请求体格式为:
{ "email": "用户登录邮箱", "password": "用户登录密码" }
如果前端传参字段名不同,修改LocalStrategy配置中的对应字段值即可。
- 第三步:确认中间件加载顺序
必须严格按照「请求体解析中间件 > Passport初始化中间件 > 路由定义」的顺序加载,调整后的Admin.js代码参考:
const express = require('express') const router = express.Router() // 第一步:先注册请求体解析中间件 router.use(express.json()) router.use(express.urlencoded({ extended: false })) // 第二步:再初始化Passport router.use(passport.initialize()) router.use(passport.session()) // persistent session // initializing the passport try { initializePassport(passport) } catch (error) { console.log("Found where the error is") } // 第三步:最后定义路由 router.post("/login",passport.authenticate('local', { successRedirect:'http://localhost:3000/admin/success', failureRedirect:'http://localhost:3000/admin/something', }),(req,res)=>{ console.log(req) })
小提示:你当前代码中是明文比对密码,生产环境请务必使用bcrypt等加密工具对密码做哈希存储后再对比,避免明文密码泄露风险。
内容的提问来源于stack exchange,提问作者abeniOG
相关产品推荐
相关产品推荐

