NodeJS、护照和本地护照
NodeJS, Passport & Passport-Local
所以我 运行 遇到了使用本地策略进行身份验证的问题。如果我传递了无效的凭据或任何不成功的东西,我会得到相应的错误。但是,如果他们身份验证成功,则会出现 404 错误。
我四处寻找,我 运行 发现的最好的想法是删除会话存储(这似乎是它发生的地方,同时序列化用户)。有人遇到过这样的问题吗?
这是部分代码,如果您需要任何其他部分的代码,请告诉我,我们很乐意提供。
我的 Passport 配置:
var passport = require('passport'),
User = require('mongoose').model('User');
module.exports = function () {
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findOne({ _id: id }, '-password -salt -__v', function (err, user) {
done(err, user);
});
});
require('./strategies/local')();
};
我的本地策略配置:
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
User = require('mongoose').model('User');
module.exports = function () {
passport.use(new LocalStrategy({
usernameField: 'email'
}, function (email, password, done) {
User.findOne({email: email}, function (err, user) {
if (err) {
return done(err);
}
if(!user || !user.active || !user.authenticate(password)) {
return done(null, false, { message: 'Authentication Failed'});
}
return done(null, user);
});
}));
};
所有其他方法都有效,我可以查询数据库以找到用户,我已经逐步将散列密码与提供的密码进行匹配,一切似乎都很好,我在 LocalStrategy 的末尾获得了一个用户(我进入了决赛 done(null, user)
。在 serializeUser()
done(null, user.id)
中发生了一些事情。我已经尝试逐步完成它,但我最终进入的内容似乎相当混乱(或者我'我太笨了,看不懂)所以我不知道到底发生了什么。
这是您的路线设置:
app.route('/login').post(passport.authenticate('local'));
这将在身份验证失败时生成 401 ("Unauthorized"),但当它成功时,没有配置接下来要发生的任何事情,因此您将收到 404.
您应该向您的路线添加一个明确的 "success" 处理程序:
app.route('/login').post(
passport.authenticate('local'),
function(req, res) {
// This will only get called when authentication succeeded.
res.json({ user : req.user });
}
);
所以我 运行 遇到了使用本地策略进行身份验证的问题。如果我传递了无效的凭据或任何不成功的东西,我会得到相应的错误。但是,如果他们身份验证成功,则会出现 404 错误。
我四处寻找,我 运行 发现的最好的想法是删除会话存储(这似乎是它发生的地方,同时序列化用户)。有人遇到过这样的问题吗?
这是部分代码,如果您需要任何其他部分的代码,请告诉我,我们很乐意提供。
我的 Passport 配置:
var passport = require('passport'),
User = require('mongoose').model('User');
module.exports = function () {
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (id, done) {
User.findOne({ _id: id }, '-password -salt -__v', function (err, user) {
done(err, user);
});
});
require('./strategies/local')();
};
我的本地策略配置:
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
User = require('mongoose').model('User');
module.exports = function () {
passport.use(new LocalStrategy({
usernameField: 'email'
}, function (email, password, done) {
User.findOne({email: email}, function (err, user) {
if (err) {
return done(err);
}
if(!user || !user.active || !user.authenticate(password)) {
return done(null, false, { message: 'Authentication Failed'});
}
return done(null, user);
});
}));
};
所有其他方法都有效,我可以查询数据库以找到用户,我已经逐步将散列密码与提供的密码进行匹配,一切似乎都很好,我在 LocalStrategy 的末尾获得了一个用户(我进入了决赛 done(null, user)
。在 serializeUser()
done(null, user.id)
中发生了一些事情。我已经尝试逐步完成它,但我最终进入的内容似乎相当混乱(或者我'我太笨了,看不懂)所以我不知道到底发生了什么。
这是您的路线设置:
app.route('/login').post(passport.authenticate('local'));
这将在身份验证失败时生成 401 ("Unauthorized"),但当它成功时,没有配置接下来要发生的任何事情,因此您将收到 404.
您应该向您的路线添加一个明确的 "success" 处理程序:
app.route('/login').post(
passport.authenticate('local'),
function(req, res) {
// This will only get called when authentication succeeded.
res.json({ user : req.user });
}
);