【问题标题】:NodeJS Express Passport - req.user is undefinedNodeJS Express Passport - req.user 未定义
【发布时间】:2020-02-13 03:09:15
【问题描述】:

我正在使用 express+passport 在小型应用程序中测试身份验证,并尝试在没有会话的情况下进行。因此用户必须为每个操作提供用户名和密码。 在下一个中间件 request.user 中授权 (passport.authenticate()) 后未定义,但 passport faq 说“如果身份验证成功,将调用下一个处理程序并将 req.user 属性设置为经过身份验证的用户。” 这里有什么问题?

列表

const express = require('express');
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const app = express();

app.use(express.json());
app.use(express.urlencoded({
  extended: true
}));

passport.use('login',
  new LocalStrategy({
      session: false,
      passReqToCallback: true
    },
    (req, username, password, done) => {
      // passport.use(new LocalStrategy((username, password, done) => {
      console.log('  In passport.use(new LocalStrategy...)');
      console.log('req.body = ', req.body);
      console.log('req.user = ', req.user);
      const user = {
        username: username,
        password: password,
      };
      if (user.username === 'Petr' && user.password === '123') {
        console.log('Username and password OK');
        return done(null, user);
      }
      return done(null, false, {
        message: 'Wrong username or password!'
      });
    },
  ),
);

app.post('/', passport.authenticate('login', {
  session: false,
  successRedirect: '/success',
  failureRedirect: '/failure',
}));

app.use('/', (req, res, next) => {
  console.log('  In app.use /');
  console.log('req.body = ', req.body);
  console.log('req.user = ', req.user);  //HERE req.user is undefined!!!
  next();
});

app.use('/', (req, res, next) => {
  console.log('Request at /');
  next();
});
app.use('/success', (req, res, next) => {
  res.send('success');
  next();
});
app.use('/failure', (req, res, next) => {
  res.send('failure');
  next();
});

app.listen(8000, () => {
  console.log('Server "Test" starts at port 8000');
});

【问题讨论】:

    标签: node.js express authentication passport.js middleware


    【解决方案1】:

    您是否为您的应用设置了会话状态?你必须像这样添加它......

    app.use(session({ secret: 'anything' }));
    app.use(passport.initialize());
    app.use(passport.session());
    

    【讨论】:

    • 在 PassportJS 文档中:在这种情况下,可以通过将会话选项设置为 false 来安全地禁用会话支持。所以我希望用户每次提出请求时都提供登录名/密码。有可能吗?
    • 是的,为什么不呢。有可能。
    • 在我的示例中,我尝试这样做,但它不起作用
    • 先生,您找到解决方案了吗?因为我也有同样的问题
    猜你喜欢
    • 2019-08-13
    • 2014-08-08
    • 2021-12-27
    • 2015-03-24
    • 2020-10-30
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多