【问题标题】:ExpressJS - Proper way to regenerate JWT after user info changesExpressJS - 用户信息更改后重新生成 JWT 的正确方法
【发布时间】:2021-09-04 12:32:45
【问题描述】:

假设在初始启动/登录后,后端向前端发送一个令牌,其中包含用户信息,例如用户名、电子邮件和其他凭据。此令牌驻留在用户的客户端中,并在每次 API 调用时被发回以进行身份​​验证。

在某一时刻,用户可能会更新他们的电子邮件。从那时起,JWT 应该重新生成,以便它包含新电子邮件而不是旧电子邮件。

我可以通过从数据库中获取最新数据并在每次“verifyAuth”调用时生成一个新令牌来实现这一点,它工作得很好,但我相信可以实现更高效的流程。

我使用的“verifyAuth”中间件几乎是一个全局中间件,几乎每次请求都会执行它并且多次执行,因此每次调用都获取数据会显着增加响应时间。

如何确保 JWT 有效地保持最新状态而无需重复数据库查询?

const verifyAuth = async (req, res, next) => {
    const { authorization } = req.headers;
  
    if (!authorization) {
      return res
        .status(status.unauthorized)
        .send({ ...error, message: 'No auth.' });
    }
  
    try {
      const token = authorization && authorization.split(' ')[1];
      const decoded = jwt.verify(token, process.env.JWT_SECRET);
  
      const { userId } = decoded;
  
      const dbResp = await db.oneOrNone(
        `SELECT id AS user_id, username, email
          FROM users
          WHERE id = $1`,
        [userId]
      );
  
      req.user = {
        accessToken: token,
        userId,
        username: dbResp.username,
        email: dbResp.email,
      };
  
      next();
    } catch (e) {
      return res
        .status(status.unauthorized)
        .send({ ...error, message: 'No auth.' });
    }
};
router.use('/api/app', verifyAuth, AppRouter);
router.use('/api/user', verifyAuth, UserRouter); // and more routers like this.

【问题讨论】:

    标签: node.js express jwt


    【解决方案1】:

    如何确保 JWT 有效地保持最新状态,而无需重复数据库查询?

    简短的回答是 - 你不能。发出 JWT 后,检查它是否包含陈旧数据的唯一方法是使用源验证该数据。但是有一些方法可以解决这个问题:

    1. 您可以缩短令牌的到期时间。如果您的令牌在 5 分钟后过期,那么这是您必须处理陈旧数据的最长时间。也许你没问题。

    2. 缓存您对数据库的调用。如果您在一个请求中使用相同的查询多次调用数据库,您可以缓存结果。您可能甚至不需要一些花哨的缓存机制,您只需将查询结果保存在内存中,然后将其用于对 DB 的后续调用。

    3. 您可以实现一项功能,以便跟踪用户数据的更改时间。例如,您设置了一个 redis 数据库(这是一个快速键值存储),您在其中保存信息“userId - 最后一次数据更改的时间戳”。然后,当您验证令牌时,您可以检查它是否在您在 Redis 中拥有该条目之前发出。如果为真,那么您调用数据库获取新数据。调用 Redis 将比调用你的 SQL DB 轻得多。

    【讨论】:

      猜你喜欢
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2018-05-27
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多