您可以在不重定向的情况下使用Passport进行身份验证吗?

时间:2014-11-11 07:00:52

标签: node.js passport.js passport-local

我有以下工作代码通过护照本地策略进行身份验证:

  app.post('/api/login', passport.authenticate('local-login', {
    successRedirect : '/api/login/success',
    failureRedirect : '/api/login/error',
    failureFlash : true
  }));
  app.get('/api/login/error', function(req, res) {
    res.send(401, {error: req.flash('loginMessage')});
  });
  app.get('/api/login/success', function(req, res) {
    res.send(200, {user: req.user});
  });

但是,理想情况下,我希望从一条快速路线处理错误和成功消息,而不是重定向到另外两条路线。

这可能吗?我尝试使用'自定义回调'但由于某种原因,这似乎在序列化用户时出错。

2 个答案:

答案 0 :(得分:6)

您可以使用自定义回调,例如:

passport.authenticate('local', function (err, account) {
    req.logIn(account, function() {
        res.status(err ? 500 : 200).send(err ? err : account);
    });
})(this.req, this.res, this.next);

在错误的对象中,您可以找到所有需要的错误,这些错误是在身份验证时出现的。

答案 1 :(得分:5)

你使用的是猫鼬吗? 尝试将此添加到您的server.js / index.js

var User = mongoose.model('User');
passport.use(new LocalStrategy(User.authenticate()));
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

这是你的路线index.js

var auth = require('./auth');
app.post('/api/auth/login', passport.authenticate('local'),auth.login);

auth.js:

var UserModel = require('../models/user');
var User = new UserModel();

exports.login = function(req, res) {
    var user = req.user;
    req.login(user, function(err) {
        //if error: do something
        return res.status(200).json(user)
    });
};

将其添加到模型index.js

var passportLocalMongoose = require('passport-local-mongoose');
userSchema.plugin(passportLocalMongoose, {
    usernameField: 'email',
    usernameLowerCase: 'true'
});

我在这里对结构和包做了很多假设。但这应该有用

修改

对于自定义回调:

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

在这里,您可以使用res.redirect

return res.status(404).json("Not Found)来代替{{1}}

有关详细信息,请参阅文档:http://passportjs.org/guide/authenticate/