Javascript 重置密码后如何从其他浏览器注销
我想在重置密码后从其他浏览器注销 我使用passport.js进行用户身份验证 因此,我需要这样一种功能,如果我从一个浏览器更改密码,它将自动从另一个浏览器注销该用户(当切换到另一个浏览器时) 有什么想法吗Javascript 重置密码后如何从其他浏览器注销,javascript,node.js,passport.js,Javascript,Node.js,Passport.js,我想在重置密码后从其他浏览器注销 我使用passport.js进行用户身份验证 因此,我需要这样一种功能,如果我从一个浏览器更改密码,它将自动从另一个浏览器注销该用户(当切换到另一个浏览器时) 有什么想法吗 function validateToken(token) { return require("mongoclient").then(function (DB) { return DB.query({$collection: "pl.connections", $filter: {t
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验证节点中令牌的示例代码
在应用程序中添加一些功能。在数据库中维护一个对应于用户的令牌表,这样在更改密码后,就可以使表中特定用户的令牌过期。这不仅仅是一个想法,也是许多应用程序所采用的一种工作策略 您可以在客户端创建计时器。 使用setInterval函数。 发送函数,该函数将转到服务器并检查您是否需要注销 (在某些系统中,此逻辑用于检查过期会话) 更新: 在评论之后,我注意到我忘记了写下的关键细节:
当然,当您的密码被更改时,服务器本身需要阻止任何操作。我的意思是客户端-您想注销它。例如,您可以在用户表中添加
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 ...
您可以使用会话Id轻松存档此文件,会话Id是每次用户通过身份验证时生成的,并且是用户独有的。但是您必须跟踪Id
在此解决方案中,我使用express会话
成功的身份验证req.session.id
分配给用户后,它是一个字母数字id(6qp2t2t2\u 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')
});
});
像这样的客户端逻辑永远不应该被用来控制身份验证,因为它是不安全的。你能说得更详细些吗?或者您可以展示一些代码示例吗?@BlackMamba检查答案以了解更多规范您的方法似乎是,对于每个请求,我们都需要从db加载用户?是否耗时?@BlackMamba是的,我为每个请求提供了一种方法。简单的SELECT*
对性能影响不大。