【问题标题】:Passport wouldn't return fields other than username and passwordPassport 不会返回用户名和密码以外的字段
【发布时间】:2019-08-22 02:32:57
【问题描述】:

在我的设置中,路由被编程为在成功验证后打印 Passport 返回的所有数据:

// routes/auth-providers/local.js

import express from 'express';
import passport from 'passport';
import jwt from 'jsonwebtoken';
import dotenv from 'dotenv';
import passportSetup from '../../passport-setup';

dotenv.config();

const router = express.Router();
router.post('/',
  passport.authenticate('local', { failureRedirect: '/' }),
  (req, res) => {
    const {username, firstName, lastName} = req.body;
    console.log('req.body', req.body);
    res.json({ success: true });
  }
);

我的本​​地策略配置如下:

// passport-setup/strategies/local.js

const local = new LocalStrategy (
  (username, password, done) => {
    User.findOne({ username: username }, (err, user) => {
      if(err) { return done(err); }
      if (!user) { return done(null, false); }
      // if (!user.verifyPassword(password)) { return done(null, false); }
      console.log('USER', user);
      return done(null, user);
    });
  }
);

在两个console.log() 语句中,只有第二个给出了整个用户文档,包括名字、姓氏等。但是,我的路线中的第一个(console.log('req.body', req.body);)只给出了用户名和密码。我什至可以看到正在序列化的用户文档:

// passport-setup/index.js

passport.serializeUser((user, done) => {
  console.log('SERIALIZE', user);
  done(null, user.id);
});

我可能做错了什么?

P.S.:回购位于https://github.com/amitschandillia/proost/tree/master/web 以供参考。

【问题讨论】:

  • req.body 取决于您从客户端发送的内容,因此您可能只是发送了用户名和密码。
  • 我认为在这种情况下req.body 是由 Passport 发送的?如果您看到上面的代码,Passport 能够从数据库中检索完整的用户对象,如new LocalStrategy () 中的console.log() 所示。然而,当我尝试读取路径中的 body 对象时,它只显示用户名和密码。

标签: mongoose passport-local


【解决方案1】:

我还是 passport.js 的新手,但在文档 here 中,它提到:

如果身份验证成功,将调用下一个处理程序并将req.user 属性设置为经过身份验证的用户

所以也许您需要做的只是将req.body 更改为req.user

const {username, firstName, lastName} = req.user;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 2018-08-16
    • 2017-01-21
    • 2012-10-13
    • 2011-10-08
    • 2013-03-21
    • 2020-01-05
    • 2014-01-29
    相关资源
    最近更新 更多