NodeJS和PassportJS - 会话丢失

时间:2014-11-20 16:16:22

标签: node.js session mobile passport.js

目前我正在编写一个移动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,安迪

0 个答案:

没有答案