passportJS req.user 未定义(未反序列化)

问题描述 投票:0回答:2

我已按照passportJS文档中描述的步骤配置本地身份验证。我几乎复制粘贴了他们的代码来测试它是否有效。

但是,我现在有 2 个(相关的?)问题:

  1. deserializeUser 永远不会被调用
  2. req.user 未定义

我尝试了相关帖子中提到的几乎所有内容(更改中间件订单,在客户端放置 withCredentials: true ,...),但似乎没有任何效果。有人可能会看到我在这里做错了什么吗?

index.js

app.use(express.json()); // to send data to the database
app.use(express.urlencoded({ extended: true }));
app.use(
  cors({
    origin: "http://localhost:3000", // location of the react app
    credentials: true,
  })
);
app.use(
  session({
    secret: "secretcode",
    resave: false,
    saveUninitialized: false,
  })
);
app.use(passport.session());
app.use(cookieParser("secretcode"));
app.use(passport.initialize());
config(passport);


app.post("/login",   passport.authenticate('local', { failureRedirect: '/login', failureMessage: true }),
function(req, res) {
  res.redirect('/~' + req.user.username);
});

app.get("/user", (req, res) => {
  res.send(req.user); 
});

config.js

export const config = (passport) => {
  passport.use(new LocalStrategy(function verify(username, password, cb) {
    db.query('SELECT * FROM users WHERE username = ?', [ username ], function(err, user) {
      if (err) { return cb(err); }
      if (!user) { return cb(null, false, { message: 'Incorrect username or password.' }); }
  
      bcrypt.compare(password, user[0].password, (err, result) => {
        if (err) { return cb(err); }
        if (result === true) {
          return cb(null, user[0]);
        }
        return cb(null, false, { message: 'Incorrect username or password.' });
      });
    });
  }));

  passport.serializeUser(function(user, cb) {
    process.nextTick(function() {
      return cb(null, user.id);
    });
  });
  
  passport.deserializeUser(function(id, cb) {
    db.query('SELECT * FROM users WHERE id = ?', [ id ], function(err, user) {
      if (err) { return cb(err); }
      return cb(null, user);
    });
  });
};
node.js express authentication web passport.js
2个回答
0
投票

相信您的问题可能是因为您没有包含

app.use(passport.authenticate('session'))
。尝试一下。

您还可以通过将路径传递到

ensureLogIn
中间件来进一步调试,因为我过去在这方面遇到过问题。如果您知道正在重定向的内容,它将有助于调试。

请在此处找到一个工作准系统,以获取工作护照本地和快速示例,而不会出现任何臃肿的情况。我认为将此与您的应用程序进行比较是最好的选择。

请告诉我这是否有帮助。

const express = require('express')
const passport = require('passport')
const LocalStrategy = require('passport-local')
const session = require('express-session')
const ensureLogIn = require('connect-ensure-login').ensureLoggedIn
const cookieParser = require('cookie-parser')
const app = express()
const port = 3000
const ensureLoggedIn = ensureLogIn('/not-logged-in')

app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false
}))

app.use(passport.authenticate('session'))
app.use(passport.initialize())
app.use(cookieParser())
app.get('/', (req, res) => {
  res.json({ hello: 'world' })
})

app.all('/secure', ensureLoggedIn, (req, res) => res.json({ is: 'secure' }))

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
passport.use(new LocalStrategy({
  usernameField: 'username',
  passwordField: 'password',
  session: true
},
function (username, password, cb) {
  if (username !== 'hello' && password !== 'world') {
    console.log('verify', username, password, 'fail')
    return cb(null, false)
  } else {
    console.log('verify', username, password, 'pass')
    return cb(null, { username: 'hello' })
  }
}
))

passport.serializeUser(function (user, cb) {
  process.nextTick(function () {
    console.log('serializeUser', user)
    cb(null, user)
  })
})

passport.deserializeUser(function (user, cb) {
  process.nextTick(function () {
    console.log('deserializeUser', user)
    return cb(null, user)
  })
})
app.post('/logins',
  passport.authenticate('local', {
    // successReturnToOrRedirect: '/',
    failureRedirect: '/login-fail',
    failureMessage: true
  }),
  function (req, res) {
    console.log('logged in', req.params, req.user)
    // res.send('Logged in')
    res.redirect('/secure')
  }
)

0
投票

你能展示一下

app.post('signup')
函数吗,我遇到了类似的问题,这是因为我传递给passport js的
newUser
对象没有用户详细信息。

req.login(newUser, function(err) {
        if (err) { return next(err); }
        res.redirect('/user/feed');
      });

当我在 MongoDB 中使用

Model.collection.insertOne
时,它没有返回用户对象。 因此事情不起作用。 相反,当我使用
Model.create
时,一切都很顺利。

© www.soinside.com 2019 - 2024. All rights reserved.