gpt4 book ai didi

node.js - 在 express.js 中使所有单个用户的 session 无效

转载 作者:搜寻专家 更新时间:2023-11-01 00:24:37 25 4
gpt4 key购买 nike

出于安全原因,我们希望能够使用户的所有事件 session 无效,例如,如果他们更改了密码,或者只是希望能够强制注销他们的其他 session 。我们正在使用 Node.js、Express、express-sessions 和 Redis session 存储。在我们的应用程序中,我们有 (CoffeeScript):

app.use express.session
cookie:
maxAge: 5 * 24 * 60 * 60 * 1000 # 5 days in ms
store: new RedisStore(client: rclient)
key: "secret-key"

Redis 存储通过将唯一 session ID 映射到您存储在 session 中的任何数据来工作。例如:

# In an HTTP request
req.session.user = { _id: "user-id" }

在 Redis 中变为:

> get "sess:<session-id>"
'{ "user": { "_id": "user-id" } } '

我们需要一种方法来跟踪与每个用户 ID 相对应的所有 session ,以便我们可以在要使用户 session 无效时从 Redis 中删除这些 session 。以下注意事项适用:

  1. session 在 Redis 中被赋予一个 TTL,等于 session 的 maxAge曲奇饼。每个 session 的跟踪机制也应该过期在此时间之后以避免数据过时。
  2. 并非所有 session 都必须与用户相关联。有些仅用于跟踪匿名 session 详细信息。

在警告 (1) 时,在 Redis 中添加另一个反向查找键(例如将 user_id 映射到用户的一组 session ID)的天真方法失败了。

这感觉像是其他使用 Express 的站点一定遇到过的问题,因为它是一种非常常见的安全模式。有人对如何跟踪用户 session 然后按需使它们无效有任何建议吗?

谢谢!

最佳答案

我在类似情况下所做的是使用自定义 session ID,该 ID 在键名中包含用户 ID。也许现在有一种更简单的方法可以做到这一点,但这基本上是我设置自定义 session ID 所要做的:

主要.js:

var uid = require('uid'),
redis = require('redis'),
session = require('express-session'),
RedisStore = require('connect-redis')(session),
Session = session.Session,
Cookie = session.Cookie;

var utils = require('./utils');

var COOKIE_SECRET = 'somethingrandom',
COOKIE_KEY = 'mycustomsession';

var redisClient = redis.createClient(),
redisStore = new RedisStore({
client: redisClient,
ttl: 24 * 60 * 60, // 1 day session expiration
prefix: 'sess:'
});

// ... then inside the login route after user was successfully authenticated ...
req.sessionStore = redisStore;
req.sessionID = 'sess:' + user.id + ':' + uid(24);
req.session = new Session(req);
req.session.cookie = new Cookie({});
req.session.user = user;
utils.createSession(req, res, COOKIE_KEY, COOKIE_SECRET);

utils.js:

var onHeaders = require('on-headers'),
signature = require('cookie-signature');
exports.createSession = function(req, res, name, secret) {
var trustProxy = true;
// ripped from express-session
onHeaders(res, function() {
if (!req.session)
return;

var cookie = req.session.cookie
, proto = (req.headers['x-forwarded-proto'] || '').split(',')[0].toLowerCase().trim()
, tls = req.connection.encrypted || (trustProxy && 'https' == proto);

// only send secure cookies via https
if (cookie.secure && !tls)
return;

var val = 's:' + signature.sign(req.sessionID, secret);
res.cookie(name, val, cookie.data);
});

// proxy end() to commit the session
var end = res.end;
res.end = function(data, encoding) {
res.end = end;
if (!req.session) return res.end(data, encoding);
req.session.resetMaxAge();
req.session.save(function(err) {
if (err) console.error(err.stack);
res.end(data, encoding);
});
};
};

关于node.js - 在 express.js 中使所有单个用户的 session 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26303131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com