Javascript 重置密码后如何从其他浏览器注销

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

我想在重置密码后从其他浏览器注销

我使用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验证节点中令牌的示例代码


在应用程序中添加一些功能。在数据库中维护一个对应于用户的令牌表,这样在更改密码后,就可以使表中特定用户的令牌过期。这不仅仅是一个想法,也是许多应用程序所采用的一种工作策略

您可以在客户端创建计时器。 使用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*
对性能影响不大。