【问题标题】:Passport.js custom callback passing parameterPassport.js 自定义回调传递参数
【发布时间】:2017-01-05 12:20:12
【问题描述】:

到目前为止我有这个代码

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());


用户.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);

【问题讨论】:

    标签: javascript express passport.js


    【解决方案1】:

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

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

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

    【讨论】:

    • @Amir 请查看我的编辑以了解我是如何编写策略的
    • @Ogen 你在某个地方也有passport.use(new LocalStrategy(User.authenticate())); 吗?如果其他设置正确,我的答案中的代码应该可以工作。例如,您可以通过向用户显示 internal error 消息来处理 err 情况,并使用 wrong username/password 处理 !user 情况。还有console.logerr,如果存在,请查看原因。
    猜你喜欢
    • 2011-07-05
    • 2018-02-27
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    相关资源
    最近更新 更多