【问题标题】:Passport Local Strategy with Custom Callback Never Works带有自定义回调的护照本地策略永远不会起作用
【发布时间】:2015-10-16 04:51:13
【问题描述】:

我在使用 Passport 时遇到了很多困难,因为自定义回调功能根本不起作用。这是我初始化护照的方法:

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');

// Set up passport
passport.use('local', new LocalStrategy({
    usernameField: 'userId',
    passwordField: 'password'
}, function (userId, password, cb) {
    users.findByUserId(userId, function (err, user) {
        if (err) {
            return cb(err);
        }
        if (!user) {
            return cb(null, false);
        } else {
            if (user.password !== password) {
                return cb(null, false);
            }
            return cb(null, user);
        }
    });
}));
passport.serializeUser(function (user, cb) {
    cb(null, user.userId);
});
passport.deserializeUser(function (id, cb) {
    users.findByUserId(id, function (err, user) {
        if (err) { return cb(err); }
        cb(null, user);
    });
});

那么,当用户发帖到“/login”时,应该这样登录用户:

exports.tryLogin = function (req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message }); }
        if (!user) { return res.status(500).json({ success : false, message : 'user not found'}); }
        req.logIn(user, function(err) {
          if (err) { return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message }); }
          return res.status(200).json({ success : true });
        });
      })(req, res, next);
}

我必须这样做,因为它永远不会检测到用户。上述方法中的“用户”始终未定义。我必须自己根据请求构建它才能使其工作:

exports.tryLogin = function (req, res, next) {
    var user = {
        userId: req.body.userId,
        password: req.body.password
    }
    req.logIn(user, function (err) {
        if (err) {
            return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message });
        }
        return res.status(200).json({ success : true, message : 'authentication succeeded' });
    });
}

这可行,但感觉不对,因为我从不调用 passport.authenticate。这可以吗,还是我应该把头撞到墙上,试图让自定义回调按照文档中的定义工作?

山姆

【问题讨论】:

  • 我也会尽力帮助您解决custom callback feature 的问题。但我需要更多细节,在你回答我之后我会更新我的回复
  • custom callback feature simply does not work. 什么意思?什么是自定义回调?这种“不工作”是如何表现出来的?
  • 在您的第一个代码 sn-p 中有部分 users.findByUserId users 对象是什么?我假设这是您的 orm 模型?你在哪里定义它?

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


【解决方案1】:

是的,这是错误的方法。

这段代码的意思是:

exports.tryLogin = function (req, res, next) {
    var user = {
        userId: req.body.userId,
        password: req.body.password
    }
    req.logIn(user, function (err) {
        if (err) {
            return res.status(500).json({ success : false, message : 'Internal server error: ' + err.message });
        }
        return res.status(200).json({ success : true, message : 'authentication succeeded' });
    });
}

你不检查权限,你实际上登录任何人都没有密码检查。

【讨论】:

  • 感谢您的回复。我明白你登录任何人的意思。我需要的自定义回调是文档中定义的回调:passportjs.org/docs(在此页面上搜索“自定义回调”)。我基本上只需要使用它来在用户登录时发送 http 响应,而不是进行重定向,这是护照提供的另一个选项。
  • 'Users' 是我用来管理对用户数据库的访问的服务。我基本上是在查询数据库中的用户,如下所示: connection.query("select * from user_table where userId='" + userId + "' ", function (err, user) {});我很肯定我的用户模块正在运行,因为一旦登录,一切正常,并且可以访问、更新帐户等。
  • 这种“不工作”是如何表现出来的?如果你把 console.log 放在这个自定义回调中,它会显示在终端中吗?
  • 还有一些非常琐碎的事情,你的代码中有没有这个app.use(bodyParser.urlencoded({"extended":true}));app.use(passport.initialize());
  • 是的,我有,谢谢。发生的事情是自定义回调中返回的“用户”始终未定义。
猜你喜欢
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多