首页 > 解决方案 > NodeJS Express Passport - req.user 未定义

问题描述

我正在使用 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.jsexpressauthenticationpassport.jsmiddleware

解决方案


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

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

推荐阅读