Passport.js自定义回调传递参数

时间:2017-01-05 12:20:12

标签: javascript express passport.js

到目前为止我有这个代码

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

成功登录正在运行。但是,当登录失败时,它会通过GET请求重定向到/login。所以我需要一些像这样的额外代码来处理这种情况:

app.get('/login', ...);

我需要以这样的方式实现这一点:如果POST失败并重定向到此GET,它将发送使其失败的用户名。这样我就可以将用户名填充回表单中,这样每次有人因为用户名不正确而尝试登录失败时都不会清除用户名。

我怎样才能做到这一点?

编辑:这是我编写策略的方式。

passport.use(User.createStrategy());

user.js的

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

var User = new Schema({
    username: String,
    firstName: String,
    lastName: String,
    dateOfBirth: Date,
    email: String,
    mobileNumber: Number,
    favouriteWebsite: String,
    favouriteColour: String
});

User.methods.getFullName = function() {
    return this.firstName + " " + this.lastName;
}
User.methods.getAge = function() {
    return ~~((Date.now() - new Date(this.dateOfBirth)) / (31557600000));
}

User.plugin(passportLocalMongoose, {
    usernameQueryFields: ["username", "email"], // TODO not working
    errorMessages: {
        IncorrectPasswordError: "Incorrect password!",
        IncorrectUsernameError: "Username does not exist!"
    }
});

module.exports = mongoose.model("User", User);

1 个答案:

答案 0 :(得分:3)

您可以使用passport.authenticate自己致电(req, res, next)。它接受一个回调函数作为其输入,以便您可以确定该过程是否成功。

app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err || !user) {
      // failed
    } else {
      // successful
    }
  })(req, res, next);
});

您可能希望分别处理err!useruser === false)。 err表示流程中存在一些内部错误,但当用户不存在时,用户将为false。这取决于你如何编写策略。