0

所以我正在构建一个前端有 angular 和后端有 nodejs/express 的应用程序。我的问题是,当使用 express-session 时,每个请求都会创建一个新的会话 cookie。

我搜索了很多问题和答案,但似乎大多数已回答的问题都是关于 express 3.x 的问题,而我正在使用 express 4.x。

这是我正在处理的代码:

var bcrypt = require('bcrypt');
var express = require('express');
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var session = require('express-session');
var dbSchemas = require('./database-schemas.js');
var userDB = require('./UserDatabaseQuery');
var MongoDBStore = require('connect-mongodb-session')(session);
var cookieParser = require('cookie-parser');

var app = express();

var store = new MongoDBStore({
    uri: 'mongodb://localhost:27017/connect_mongodb_session',
    collection: 'mySessions'
});

mongoose.connect('mongodb://localhost/dbSPPM');
var db = mongoose.connection;
var Schema = mongoose.Schema;

var SALT_WORK_FACTOR = 10;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

app.use(cookieParser());
app.use(session({
    secret: 'th3s3cr3tc0d30fd00m',
    cookie: {
        path: '/',
        maxAge: 1000 * 60 * 10
    },
    store: store,
    resave: false,
    saveUninitialized: false
}));


app.use(function (req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With');
    next();
});

app.get('/userLoggedIn', function(req, res) {
    if(req.session) {
        console.log('session cookie: \n' + JSON.stringify(req.session));
    }
    res.send({
        loggedIn: req.session.username
    });
})

app.post('/login', function(req, res) {
    var username = req.body.data.username;
    var password = req.body.data.password;

    var User = mongoose.model('User', dbSchemas.userSchema);

    User.findOne({username: username}, function(err, user) {
        if (err) {
            console.log(err);
        } else {
            bcrypt.compare(password, user.password, function(err, isMatching) {
                if (err) {
                    console.log(err);
                } else {
                    if (isMatching) {
                        res.send({
                            loggedIn: true,
                            session: req.session
                        });
                    } else {
                        res.send({
                            loggedIn: false,
                        });
                        return;
                    }
                }
            });
        }
        req.session.username = username;
        console.log('created session cookie: \n' + JSON.stringify(req.session));
    });
});`

当我这样做时,console.log我得到了这个:

created session cookie:
{"cookie":{"originalMaxAge":600000,"expires":"2015-10-07T11:40:34.392Z","httpOnly":true,"path":"/"},"username":"LosGlennos"}
session cookie:
{"cookie":{"originalMaxAge":600000,"expires":"2015-10-07T11:40:38.262Z","httpOnly":true,"path":"/"}}

如您所见,get 和 post 创建了两个不同的会话 cookie。

我实际上不知道我在哪里搞砸了,我已经阅读了很多次代码,以至于变量名开始听起来很有趣。

编辑 我想要完成的事情是创建会话 cookie 并查看“LosGlennos”的会话是否已过期。

4

1 回答 1

0

我今天刚遇到同样的问题。由于 Angular 代码不在原始帖子中,我不确定您是否有同样的问题,但我会发布我的解决方案以防万一。

我遇到的问题是 POST 请求默认不发送 Cookie。所以我的 sessionID 没有在登录请求中发送。看:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials

发送 Cookies,可以在 post 操作中设置 withCredentials 为 true

$http.post(
  '/login', 
  { 
    username: theUsername, 
    password: thePassword 
  }, 
  { 
    withCredentials: true 
  }
)

这是 Angular 文档中列出的一个选项:

https://docs.angularjs.org/api/ng/service/ $http

过去我也遇到过 sessionId 命名问题,默认名称 connect.sid 被另一个包使用。我注意到您的代码将默认为 connect.sid,因此使用唯一名称可能会有所帮助:

app.use(session({
  ...
  name: 'myUniqueAppName'
}))
于 2016-01-04T20:48:26.893 回答