2016-09-21 39 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