【问题标题】:Can you authenticate with Passport without redirecting?您可以在不重定向的情况下使用 Passport 进行身份验证吗?
【发布时间】:2015-01-07 16:11:28
【问题描述】:

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

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

但是,理想情况下,我想处理来自一个快速路由的错误和成功消息,而不是重定向到两个额外的路由。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 完美!您是否碰巧知道本地注册是否有 req.logIn 的等价物?除此之外,非常感谢!
    • 只需要编写其他策略,调用函数注册新用户
    【解决方案2】:

    你在用猫鼬吗? 尝试将此添加到您的 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);
    });
    

    在这里,您可以使用 return res.status(404).json("Not Found) 之类的东西来代替 res.redirect

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

    【讨论】:

    • 就身份验证而言,一切正常,只是回调(在您的情况下为 auth.login)仅在登录成功时才被触发。我也想在失败时给出消息,这是你在策略中无法做到的。
    • 感谢@Clto,你无意中回答了我的 4 个随机问题
    • 你也有用户模型吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 2022-10-05
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多