假设在初始启动/登录后,后台向前端发送一个token,其中包含用户名、电子邮件和其他凭据等用户信息。此令牌驻留在用户的客户端中,每次调用API进行身份验证时都会将其发回。
在某个时刻,用户可能会更新他们的电子邮件。从那时起,JWT应该重新生成,以便它包含新的电子邮件而不是旧的电子邮件。
我可以通过从数据库获取最新的数据并在每次“verifyAuth”调用时生成一个新的令牌来实现这一点,它基本上工作得很好,但我相信可以实现一个更有效的流程。
我使用的'verifyAuth‘中间件几乎是一个全局中间件,它几乎在每次请求时都会执行,并且会多次执行,所以每次调用时获取数据都会显著增加响应时间。
如何在不重复数据库查询的情况下确保JWTs是最新的?
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.
发布于 2021-06-21 15:54:25
如何在不重复数据库查询的情况下确保JWTs是最新的?
简而言之,你不能。一旦发布了JWT,检查它是否包含过时数据的唯一方法就是使用源验证该数据。但是有一些方法可以解决这个问题:
https://stackoverflow.com/questions/68057717
复制相似问题