【发布时间】:2019-01-28 12:24:20
【问题描述】:
我想在重设密码后退出其他浏览器。
我使用 passport.js 进行用户身份验证。
所以我需要这样一种功能,如果我从一个浏览器更改我的密码,那么它会自动从另一个浏览器注销该用户(当切换到另一个浏览器时)。
有什么想法吗?
【问题讨论】:
标签: javascript node.js passport.js
我想在重设密码后退出其他浏览器。
我使用 passport.js 进行用户身份验证。
所以我需要这样一种功能,如果我从一个浏览器更改我的密码,那么它会自动从另一个浏览器注销该用户(当切换到另一个浏览器时)。
有什么想法吗?
【问题讨论】:
标签: javascript node.js passport.js
function validateToken(token) {
return require("mongoclient").then(function (DB) {
return DB.query({$collection: "pl.connections", $filter: {token: token}});
}).then(function (data) {
if (data && data.result && data.result.length > 0) {
return true;
} else {
return false;
}
})
}
不是一个完整的实现,而是一个使用 mongo 验证节点中令牌的示例代码
在您的应用中添加一些功能。在您的数据库中维护一个与用户相对应的令牌表,因此在更改密码后,只会使特定用户表中的令牌过期。它不仅仅是一个想法,它是许多应用程序采用的工作策略。
【讨论】:
例如,您可以将expireAfter 标志添加到您的用户表中。当您需要注销某人时,只需将他们的 expireAfter 更改为当前时间。
如果当前时间戳大于expireAfter,那么您只需在请求到来时清除浏览器中的 cookie。
而当登录刚刚设置 expireAfter 到 2030 年 1 月 1 日
// something like that
var app = express();
app.use(function(req, res, next) {
var user = { ... } // load user from db
if (user.expireAfter >= new Date().getTime()) {
res.clearCookie('user_id') // or whatever you have
var err = new Error('not authorized, please re-login');
err.status = 403;
return next(err);
}
next();
});
... code code code ...
【讨论】:
load user from db?很费时间吗?
SELECT * 对性能影响不大。
您可以使用 session Id 轻松归档此内容,该 ID 是在每次对用户进行身份验证时生成的,并且对用户来说是唯一的。但是您必须跟踪 Id
在这个解决方案中我使用express-session
在成功的身份验证req.session.id 分配给用户后,它是一个字母数字ID(6QP2t2_ffzkLNPHWNIEuRSXEvNm4lzLb)。您可以在帐户登录时保存此用户会话 ID,然后您可以随时从内存存储中检索用户的会话并销毁它:
let session = require('express-session');
const id = req.session.id
sessionStore = express.session.MemoryStore();
sessionStore.get(id, function(err, sess) {
sess.destroy (function (err) {
console.log(err, 'if any')
});
});
【讨论】:
您可以在客户端创建计时器。 使用 setInterval 函数。 发送功能,将转到服务器并检查您是否需要注销。
(在某些系统中,此逻辑用于检查过期会话)
更新:
在评论之后,我注意到我忘记了写下的关键细节: 当然,当您更改密码时,服务器本身需要阻止任何操作。我的意思是客户端 - 你想注销它。
【讨论】: