使用 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,使用 Handlebars 获取用户输入
phonegap ajax 用户身份验证与 nodejs-express-mongodb-passport js
使用 Passport.js 和 Sails.js 注册后如何重定向到特定位置?