2015-10-07 105 views
0

因此,我正在構建一個應用程序,其前端爲angular,後端爲nodejs/express。我的問題是,當使用快速會話時,每個請求會創建一個新的會話cookie。快速會話爲每個請求創建新的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。

我實際上並不知道我在哪搞亂了,我已經讀了很多次這些代碼,變量名開始聽起來很有趣。

編輯 我試圖完成的事情是如果「LosGlennos」會話過期得到創建的會話cookie和視圖。

+0

我有同樣的問題。 – lonelyloner

+0

顯然,當我在Android設備上的WebView上運行它時,問題不會發生。 還應該說這是一個cordova應用程序。 – LosGlennos

回答

0

我今天剛剛有同樣的問題。由於Angular代碼不在原文中,因此我不確定您是否遇到同樣的問題,但我會發布我的解決方案以防萬一。

我遇到的問題是POST請求默認情況下不發送Cookie。所以我的sessionID沒有在登錄請求中發送。請參閱:

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

發送cookie,你可以設置withCredentials爲true在術後

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

這是在角文檔中列出的選項:

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

在過去,我也有sessionId命名問題,其中缺省名稱connect.sid由ano使用它包。我注意到你的代碼將默認爲connect.sid,所以它可能有助於使用一個唯一的名稱:

app.use(session({ 
    ... 
    name: 'myUniqueAppName' 
})) 
相關問題