Passport JS,错误重定向的值为空

时间:2015-05-04 19:13:22

标签: javascript node.js express passport.js

我在我的网站上使用标准护照本地策略(使用express.js)进行注册表单。调用failureRedirect时,它会正确地重定向回我的注册表单,但我的表单的所有值都将被删除。我知道为什么会发生这种情况,因为重定向,但是......如果他们犯了一个简单的错误,比如忘记了一个复选框或者他们的用户名已被采用,这对用户来说是非常烦人的。 (另外,我知道密码不应该发送回视图)。有没有办法在用护照重定向后保持用户输入的值?

//my route
.post('', passport.authenticate('local-signup', {
    failureRedirect: '/account/signup', // redirect back to the signup page if there is an error
    failureFlash: true // allow flash messages
}), function(req, res) {
    ...
});

护照代码

passport.use('local-signup', new LocalStrategy({
        usernameField: 'username',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    }, function(req, username, password, done) {
        process.nextTick(function() {
            if(password != params.password2) {
                return done(null, false, req.flash('error', 'Passwords do not match.'));
            }

            User.findOne({
                'username': username
            }, function(err, user) {
                // if there are any errors, return the error
                if (err)
                    return done(err);

                if (user) {
                    return done(null, false, req.flash('error', 'That username is already taken.'));
                } else {
                 ... create a new user ...
                }

            });

        });

    }));

    function(req, username, password, done) {

1 个答案:

答案 0 :(得分:0)

What if you wrap passport in your route logic. For example,

app.post('/login', function(req, res, next) {
  // Do something here with the username & password, like
  // checking if the username is available.
  if (!username || !password) {
    // Render the login form, and pass in the username and password.
    res.render('/login', {username: username, password: password});
  } else {
   // If all is validated, attempt the login:
   passport.authenticate('local-signup', {
     failureRedirect: '/account/signup', 
     failureFlash: true
   }), function(req, res) {
     ...handle response here...
   }
  }
});

I'm not sure if all of that is syntatically correct, but the idea is to do whatever application-specific validation you have to do before you attempt to authenticate with Passport.