首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ExpressJS -在用户信息更改后重新生成JWT的正确方法

ExpressJS -在用户信息更改后重新生成JWT的正确方法
EN

Stack Overflow用户
提问于 2021-06-21 00:06:23
回答 1查看 36关注 0票数 1

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

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

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

我使用的'verifyAuth‘中间件几乎是一个全局中间件,它几乎在每次请求时都会执行,并且会多次执行,所以每次调用时获取数据都会显著增加响应时间。

如何在不重复数据库查询的情况下确保JWTs是最新的?

代码语言:javascript
运行
复制
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.' });
    }
};
代码语言:javascript
运行
复制
router.use('/api/app', verifyAuth, AppRouter);
router.use('/api/user', verifyAuth, UserRouter); // and more routers like this.
EN

回答 1

Stack Overflow用户

发布于 2021-06-21 15:54:25

如何在不重复数据库查询的情况下确保JWTs是最新的?

简而言之,你不能。一旦发布了JWT,检查它是否包含过时数据的唯一方法就是使用源验证该数据。但是有一些方法可以解决这个问题:

  1. 您可以将令牌的过期时间保持较短。如果令牌在5分钟后过期,则这是您必须处理陈旧数据的最大时间。也许你对此没什么意见。

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

  1. 您可以实现一项功能,在该功能中,您将跟踪用户的数据何时发生更改。例如,您设置了一个redis数据库(这是一个快速的键值存储),其中保存了信息"userId - timestamp of last data change“。然后,当您验证令牌时,您可以检查它是否是在Redis中的条目之前发出的。如果为true,则调用DB获取新数据。调用Redis比调用SQL要轻量级得多。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68057717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档