目前我正在编写一个移动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.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);
    });

}));

Node JS Routes(部分):

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:3001 / projects获得项目json .

Case2(不起作用!):

现在在客户端 . 我用一个带有用户名和密码的http帖子到节点服务器上,我可以登录,没有错误 . 之后我创建一个http到/ projects,现在我无法达到它,因为isLoggedIn函数中的req.isAuthenticated()返回false . 我有点失去护照 Session ,对吧?

有人可以解释为什么我的会话消失或我怎么可能找出确切的问题是什么?

白兰地