使用CORS使用单页面应用程序保存用户会话?

时间:2014-05-27 00:26:56

标签: javascript ajax node.js cordova cors

我已经阅读了一些关于网络的文章甚至实现了一些,但是大部分内容都非常繁琐,并且从我的基本代码中偏离轨道导致混乱和浪费时间。

那就是说我知道我已经实现了如何实现,我只需要访问req.user对象,我很确定它存储在会话变量中。我想提供我已经完成的工作,并弄清楚如何在用户登录会话中加入我的单页抽象应用程序(cordova / phonegap)。

在我使用的服务器端(node.js,express.js和passport.js)。我通常会允许express来呈现视图,但由于我使用的是CORS抽象应用程序,我不想通过AJAX调用将模板发送到客户端,因此我在客户端构建了视图,基本上就此而言无论HTML呈现什么,我都意识到我只需要有一个AJAX POST调用来登录用户,在我的服务器上调用POST路由来验证用户。

$(document).ready(function() {

    $('body').on('submit', '#logIn', function(e){
        e.preventDefault();

        var formData = $(this).serialize();

        $.ajax({
            url: "http://mysite.io:3300/login",
            data: formData,
            type: "POST",
            crossDomain: true,
            dataType: "json",
            success: function(data, textStatus, jqXHR) {
               alert('succeeded!');
               console.log('success')
            },
            error: function(jqXHR, textStatus, errorThrown) {
              console.log(textStatus, errorThrown);
              console.log('error')
            }
         }); 

    });

});

此时我的问题与护照req.user对象有关。在CORS应用程序的客户端,会话并不完整,但似乎并不是因为客户端依赖于只有登录用户才能访问的api调用,我有这条路径。

me: function(req, res) {
    if(req.user) {

        var admin;

        if(req.user.admin === true) {
            admin = true;
        }

        var user = {
            admin          : admin,
            user_id        : req.user.id,
            name           : req.user.local.name,
            email          : req.user.local.email,
        }

        res.json(user);

    } else {
        res.redirect('/login');
    }
}

我还有其他依赖req.user对象的路由方法。所以最初的POST方法返回用户对象,比如名称等,因为我有一个看起来像这样的路由方法。

//cordova post method
app.post('/login', passport.authenticate('local-login'), function(req, res) {
    if (req.user) {
        console.log('is user');
        res.send({ user: req.user }); 
    }
    else
        console.log('is not user');
});

在此方法中,req.user返回true,允许我访问req.user对象和模板,因此在进行ajax POST调用时,我能够呈现用户配置文件。在此之后或在不同的路由调用上,该对象为false。

所以我的问题又是如何保存req.user对象,以便我可以通过其他方法访问它,以便应用程序知道用户已登录,显然是存储在会话变量中,但是我很困惑实施它?

1 个答案:

答案 0 :(得分:1)

我不知道您是如何处理CORS服务器端的,但您可能希望使用cors middleware来简化操作。无论哪种方式,您都需要确保将Access-Control-Allow-Credentials标头设置为true的值。

对于cors中间件,您所要做的就是在cors中间件配置中设置credentials: true。否则,您可以通过res.header('Access-Control-Allow-Credentials', 'true');

设置标头

您还需要将withCredentials设置为true,无论您何时进行任何ajax调用,都将发送Cookie。对于$.ajax,你会这样做:

xhrFields: {
  withCredentials: true
}

Angular的$http服务设置类似。

之后,您应该会看到req.user自动填充经过身份验证的会话。