【发布时间】: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.
【问题讨论】: