2016-09-21 94 views
2

我有一個應用程序使用Passport.js通過Facebook驗證用戶,並可以成功地這樣做。但是,只要我的node.js服務器重置,用戶就會註銷。持久登錄狀態與passport.js,mysql和快速會話

快速會話似乎是持續登錄狀態的方式,但我讀過的每個答案似乎都表示您必須使用mongodb或redis來實現此目的。我們正在使用Mysql。

有沒有辦法使用express-sessions與mysql來保持登錄狀態?

回答

1

您可以使用會話(express-session)來實現該目的。 我目前正在使用這個組合 express,express-session,express-mysql-session(用於存儲),帶有facebook和twitter策略的護照。一個基本的設置可能是這樣的。

var express = require('express'); 
var session = require('express-session'); 
var MySQLStore = require('express-mysql-session')(session); 
var app = express(); 

var options = { 
    host: '',// Host name for database connection. 
    port: '',// Port number for database connection. 
    user: '',// Database user. 
    password: '',// Password for the above database user. 
    database: ''// Database name 
}; 
var connection = mysql.createConnection(options); 
var sessionStore = new MySQLStore({ 
    checkExpirationInterval: 900000,// How frequently expired sessions will be cleared; milliseconds. 
    expiration: 86400000,// The maximum age of a valid session; milliseconds. 
    createDatabaseTable: true,// Whether or not to create the sessions database table, if one does not already exist. 
    schema: { 
     tableName: 'sessions', 
     columnNames: { 
      session_id: 'session_id', 
      expires: 'expires', 
      data: 'data' 
     } 
    } 
}, connection); 

app.use(session({ 
    key: 'MyKey', 
    secret: 'MySecret', 
    cookie: {domain: '.mydomain.com', httpOnly: true, secure: false}, 
    domain: '.mydomain.com', 
    store: sessionStore, 
    resave: true, 
    saveUninitialized: true 
})); 

/** 
* Session handle for passport 
*/ 
app.use(passport.initialize()); 
app.use(passport.session()); 

/** 
* Check if user is authenticated in a route 
*/ 
function authUser (req, res, next) { 
    if (!req.isAuthenticated()) { 
     res.redirect('/login') 
    } else { 
     next(); 
    } 
} 

router.get('/hello', authUser, function(req, res){ 
    //Code 
}); 


/** 
* Start the server on port defined by configuration 
*/ 
app.set('port', process.env.PORT || 3000); 
var server = app.listen(app.get('port')); 

更多信息在:

https://github.com/expressjs/session

https://github.com/chill117/express-mysql-session

+0

感謝您的答覆!我已經在我的應用程序中實現了上述代碼,sessionStore正在與我的mysql數據庫成功通話。我仍然很難弄清楚如何使用它來保持登錄狀態。我創建了一個名爲「loginRequest」的mysql表,這是我在tableName屬性中使用的表。有一些奇怪的事情發生。每當我在我的網站中打開任何路線時,都會將約30個條目放入loginRequest表中。爲什麼是這樣? – user2796352

+0

不知道......也許你應該在用戶「到達」路由代碼之前檢查用戶是否已通過身份驗證。我用我用來驗證每個路由中的用戶的代碼編輯答案。 – manuerumx

+0

我剛剛檢查....護照中的反序列化函數永遠不會被擊中。這顯然是一個巨大的問題,需要在持續登錄會話之前解決 – user2796352