目前我正在编写一个移动html客户端,它试图通过Passport JS提供的本地身份验证登录NodeJS服务器。我有两个案例,一个工作,一个工作失败。以下是我的代码的一部分。
客户端执行以下登录:
Authentication.logIn(user).
success(function(data){
console.log("success log in");
// HERE I MAKE A CALL TO THE PROJECT RESOURCE
});
客户工厂方法:
logIn: function logIn(user) {
return $http.post(baseURL + "/login" + "?name=" + user.name + "&password=" + user.password, {});
}
带护照的NodeJS服务器
app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) {
if (err || !user) {
return res.json(403, {error: "login failed"});
}
req.logIn(user, function(err) {
if (err) {
return res.json(403, {error: "login failed"});
}
var response = {
status : 200,
success : 'Logged In Successfully'
}
res.end(JSON.stringify(response));
});
})(req, res, next);
Passport配置:
passport.serializeUser(function(user, done) {
logger.info("Passport Login serializeUser");
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
logger.info("Passport Login deserializeUser");
User.findById(id, function(err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy(
function(req, name, password, done) { // callback with email and password from our form
User.findOne({ 'username' : username }, function(err, user) {
// if there are any errors, return the error before anything else
if (err)
return done(err);
// if no user is found, return the message
if (!user)
return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash
// if the user is found but the password is wrong
if (!user.validPassword(password))
return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata
return done(null, user);
});
}));
节点JS路由(部分):
function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect('/init');
}
app.get("/projects", isLoggedIn, function (req, res) {
// do something
});
主要案例是:
客户端在节点js服务器上创建一个带有用户名和密码的http帖子。我们在当地通过护照js登录。在一个案例中,它有效。
案例1(有效):
我去localhost:3001 / projects。它被重定向到/ init,因为我没有登录。我使用用户名和密码向节点服务器发帖。之后我可以通过localhost获取项目json:3001 / projects。
案例2(不起作用!):
现在在客户端上。我用一个带有用户名和密码的http帖子到节点服务器上,我可以登录,没有错误。之后我创建一个http到/ projects,现在我无法达到它,因为isLoggedIn函数中的req.isAuthenticated()返回false。我有点失去护照会议,对吗?
有人可以解释我的会话消失的原因,或者我怎么可能知道确切的问题是什么?
Br,安迪