【问题标题】:How to logout from another browser after reset the password重置密码后如何从其他浏览器注销
【发布时间】:2019-01-28 12:24:20
【问题描述】:

我想在重设密码后退出其他浏览器。

我使用 passport.js 进行用户身份验证。

所以我需要这样一种功能,如果我从一个浏览器更改我的密码,那么它会自动从另一个浏览器注销该用户(当切换到另一个浏览器时)。

有什么想法吗?

【问题讨论】:

    标签: javascript node.js passport.js


    【解决方案1】:
    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 验证节点中令牌的示例代码

    在您的应用中添加一些功能。在您的数据库中维护一个与用户相对应的令牌表,因此在更改密码后,只会使特定用户表中的令牌过期。它不仅仅是一个想法,它是许多应用程序采用的工作策略。

    【讨论】:

    • 你能说得更详细些吗?或者你能展示一些代码示例吗?
    • @BlackMamba 查看更多规范的答案
    【解决方案2】:

    例如,您可以将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 ...
    

    【讨论】:

    • 您的方法似乎对于每个requset,我们都需要load user from db?很费时间吗?
    • @BlackMamba 是我对每个请求的方法。简单的SELECT * 对性能影响不大。
    【解决方案3】:

    您可以使用 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')
      });
    });
    

    【讨论】:

      【解决方案4】:

      您可以在客户端创建计时器。 使用 setInterval 函数。 发送功能,将转到服务器并检查您是否需要注销。

      (在某些系统中,此逻辑用于检查过期会话)

      更新:

      在评论之后,我注意到我忘记了写下的关键细节: 当然,当您更改密码时,服务器本身需要阻止任何操作。我的意思是客户端 - 你想注销它。

      【讨论】:

      • 不应该使用这样的客户端逻辑来控制身份验证,因为它不安全。
      猜你喜欢
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2012-07-15
      • 2016-05-15
      • 2021-05-05
      • 1970-01-01
      相关资源
      最近更新 更多