注册用户后,req.isAuthenticated返回false

时间:2018-07-25 15:34:54

标签: node.js express passport.js

我已经在一些应用程序中完成了此操作,但我不知道这里发生了什么不起作用,当我进入登录页面并登录用户时,我就有一个可以使用的登录用户。但是在我注册用户后,在我的注册路径中,我将其称为passport.authenticate,但该用户仍未获得身份验证,并且我没有用户可以使用,因此我不知道出了什么问题。我还以回调格式编写了注册后路由,而没有异步/等待没有区别。并且用户被添加到我的数据库中,因此他们已经注册。

这是我的代码:

router.get('/register', function(req, res) {
   res.render('register')
});

router.post('/register', async (req, res) => {
    try{
       var newUser = new User({username: req.body.username});
       await User.register(newUser, req.body.password);
       await passport.authenticate('local');
       console.log("The user is authenticated: " + req.isAuthenticated())
       res.redirect('/');
    }
    catch(err) {
        console.log(err);
        res.redirect('/');
    }
});

console.log返回false。

用户模型:

var mongoose              = require('mongoose'),
    passportLocalMongoose = require('passport-local-mongoose');

var UserSchema = new mongoose.Schema({
    username:     String,
    password: String
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('User', UserSchema);

注册页面:

<% include ./partials/header %>

<h1>Please Sign-Up</h1>

<form action='register' method='POST'>
    <label>Username</label>
    <input type='text' name='username'>
    <label>Password</label>
    <input type='password' name='password'>

    <button type='submit'>Submit</button>
</form>


<% include ./partials/footer %>

在我的app.js文件中:

app.use(function(req,res,next) {
  console.log("Current user is: " + req.user)
  res.locals.currentUser = req.user;
  next();
});

谢谢

1 个答案:

答案 0 :(得分:1)

首先,您在这里误用了passport.authenticate-对于您通过的策略类型,此函数将返回正确的连接/与表达式兼容的中间件,在您的情况下为local。因此,实际上,如果您确实确实想像这样使用它,则需要像passport.authenticate('local')(req, res, next)这样称呼它。...但是,我不认为您真的想这样做。

您在这里有三个单独的操作

  1. 注册用户
  2. 验证用户身份
  3. 重定向用户

对我来说,应该作为三种独立的中间件发生

const registerUser = async (req, res, next) => {
  try {
    const { username, password } = req.body;
    const user = new User({ username });
    await User.register(user, password);
    return next();
  } catch (e) {
    return next(e);
  }
}

router.post('/register', 
  registerUser, // register user in the DB
  passport.authenticate('local'), // authenticate user credentials
  (req, res) => res.redirect('/') // redirect user
)

因此,为了弄清楚这里发生的事情,当点击/register路由时,它将首先尝试通过registerUser中间件注册用户。假设一切顺利,我们调用next来调用下一个中间件,这就是我们的护照本地策略(凭据仍将保留在初始请求的req.body中)。最后,如果我们的身份验证成功,passport将调用下一个可用的中间件,即我们的重定向调用。