我刚刚开始了我的Node.js之旅,我正试图解决制定用户登录的本地策略的想法。
我一直在追逐我的职能并通过Postman进行测试。现在,我的身份证明是悬而未决的,我无法理解为什么。
passport.use(new LocalStrategy(
function(username, password, done){
console.log(username) // <-- this doesn't log
User.findOne({userName: username}, function(err, user){
if(err) return done(err);
if(!user){
return done(null, false, {
message: 'Could not login with those details.'
});
}
if(!user.validPassword(password)) {
return done(null, false, {
message: 'Could not login with those details.'
});
}
return done(null, user);
})
}
))
我做了一个非常基本的帖子请求,应用了身份验证。
app.post('/login', function(req, res){
console.log(req.body)
if(!req.body.userName || !req.body.password ) {
res.status(400),
res.json({"status" : "fail", "message" : "All fields
required"});
return;
}
passport.authenticate('local', function(err, User, info){
let token;
if(err){
res.status(400),
res.json({"status" : "fail", "message" : err});
return;
}
if(User){
token = User.generateJwt();
res.status(200);
res.json({"status" : "success", "token" : token });
}else{
res.status(401);
res.json({"status" : "fail", "message" : info });
}
})
})
从我所看到的情况来看,初始检查可以很好地删除字段,但是当它点击passport.authenticate
时它会挂起并且甚至看起来不属于我定义的策略。
我一直在浏览文档,我确定我在这里遗漏了一些东西,但却无法看到它。如果有人能指出我正确的方向,我真的很感激。
答案 0 :(得分:0)
对var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket){
socket.on('new user', function(data) {
console.log(data)
})
socket.on('disconnect', function(data) {
console.log(data)
})
http.listen(3000, function(){
console.log('listening on *:3000');
})
}
的调用会返回签名为passport.authenticate
的中间件函数。在您的示例中,您使用custom callback功能,因此您必须使用处理程序中的相关参数手动调用此结果函数:
(req, res, next)
另请注意,app.post('/login', function(req, res){
console.log(req.body)
if(!req.body.userName || !req.body.password ) {
res.status(400),
res.json({"status" : "fail", "message" : "All fields
required"});
return;
}
passport.authenticate('local', function(err, User, info) {
let token;
if(err){
res.status(400),
res.json({"status" : "fail", "message" : err});
return;
}
if (User) {
token = User.generateJwt();
res.status(200);
res.json({"status" : "success", "token" : token });
} else{
res.status(401);
res.json({"status" : "fail", "message" : info });
}
// perform an actual call
})(req, res);
})
默认情况下会查找passport-local
字段,而不是username
,就像您在请求的参数验证中一样。