使用 passport.js、mysql 和 express-session 保持登录状态

Posted

技术标签:

【中文标题】使用 passport.js、mysql 和 express-session 保持登录状态【英文标题】:Persisting login states with passport.js, mysql, and express-session 【发布时间】:2017-01-29 01:16:15 【问题描述】:

我有一个应用程序,它使用 Passport.js 通过 facebook 对用户进行身份验证,并且可以成功验证。但是,每当我的 node.js 服务器被重置时,用户就会被注销。

似乎 express-sessions 是保持登录状态的方法,但我读过的每个答案似乎都说你必须使用 mongodb 或 redis 来实现这一点。我们正在使用mysql

有没有办法使用 mysql 的 express-sessions 来保持登录状态?

【问题讨论】:

【参考方案1】:

您可以使用会话(快速会话)来实现这一点。 我目前使用这种组合 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

【讨论】:

感谢您的回复!我已经在我的应用程序中实现了上述代码,并且 sessionStore 成功地与我的 mysql 数据库通信。我仍然很难弄清楚如何使用它来保持登录状态。我创建了一个名为“loginRequest”的 mysql 表,这是我在 tableName 属性中使用的表。发生了一些奇怪的事情。每当我点击站点中的任何路由时,都会在 loginRequest 表中放入大约 30 个条目。这是为什么呢? 不知道...也许您应该在用户“到达”路由代码之前检查用户是否已通过身份验证。我使用用于在每条路由中验证用户身份的代码编辑答案。 我刚刚检查过....护照中的反序列化功能永远不会被击中。这显然是一个大问题,需要在持久登录会话之前解决

以上是关于使用 passport.js、mysql 和 express-session 保持登录状态的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Passport.js?

Passport js,使用 Handlebars 获取用户输入

phonegap ajax 用户身份验证与 nodejs-express-mongodb-passport js

使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?

如何同时使用 Bearer 和 oauth2 passport.js 策略?

使用 Passport.js 验证角色和身份验证