关于Passport.js authenticate方法中user对象来源的疑问
Passport.js passport-local-mongoose 登录流程核心逻辑解析
为什么不用手动传req.body?
passport-local 策略本身就默认会自动从 req.body 里读取**username 和 password** 两个字段——这是策略内置的规则,不用你手动提取后传入,它会自己完成这一步。如果你的表单字段名不是这俩(比如用email当登录标识),可以在配置local策略时自定义:
passport.use(new LocalStrategy({ usernameField: 'email' // 指定从req.body.email里取登录标识 }, function(username, password, done) { // 验证逻辑 }));
user对象是怎么来的?
这全靠 passport-local-mongoose 的封装:
- 当你调用
passport.authenticate("local")时,中间件会自动调用 passport-local-mongoose 为你的User模型添加的authenticate()方法 - 这个方法会先去数据库里查找匹配
username的用户记录,然后用存储的哈希密码和表单传入的明文密码做校验 - 校验通过后,它会把数据库里查询到的完整用户文档实例化,作为
user对象传给回调函数
完整流程梳理
- 前端提交登录表单,POST请求携带
username和password到后端接口 passport.authenticate("local")中间件拦截请求,自动提取req.body里的字段- 调用passport-local-mongoose的验证方法,查询数据库+校验密码
- 验证通过:把数据库返回的用户实例作为
user传入回调;验证失败:返回错误信息 - 你可以在回调里调用
req.login(user)完成登录状态的持久化(比如存session)
内容的提问来源于stack exchange,提问作者user3220141
相关产品推荐
相关产品推荐

