我有一个node.js应用程序。我正在使用Json Web令牌进行授权。当我使用数据库中的用户登录时,它将为该用户创建令牌。但是我可以将该令牌用于其他用户,并且它也可以再次使用。我需要为所有用户使用不同的令牌,并且不应将一个用户的令牌用于另一用户。 (我的工作电脑上没有互联网,所以我不能在这里的计算机上写代码)对此
这是我的verify-token.js(中间件):
const jwt = require("jsonwebtoken");
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(" ")[1];
const decodedToken = jwt.verify(token, "secret_key");
req.userData = decodedToken;
next();
} catch (error) {
return res.status(401).send({
message: "Auth failed"
});
}
};
这是我的登录代码(即在此处创建令牌) 如果密码为真:
const token = jwt.sign(
{
email: user.email,
password: user.password
},
"secret_key",
{
expiresIn: "2h"
}
);
return res.status(200).send({ message: "success", token: token });
在app.js中:
const checkAuth = require('../middleware/checkauth');
router.get('/api/company',checkAuth,companyController.list);
我希望一个令牌只能用于一个用户,并且对于每次登录,它都应该为所有用户创建一个新令牌。有什么建议吗?
答案 0 :(得分:1)
您正在将电子邮件包含在令牌正文中;为什么还不将用户ID包括在声明中(字段)?当您验证令牌时,如果令牌成功,它将把正文返回给您,因此您将知道令牌是为哪个用户创建的,如果不是发出请求的用户,则将拒绝它。
为确保两个人不会同时使用同一令牌,您可以在生成有效令牌,令牌过期或撤销(例如,用户退出时)时保留每个有效令牌的列表或举报冒名顶替者(如果冒充者行之有效),将其从列表中删除。在验证过程中,如果令牌不在列表中,则甚至不必费心对其进行解码,只需立即将其拒绝即可。
如果您给令牌赋予适当的较小的有效期窗口(我相信建议使令牌的使用期限不超过1小时),则不必担心太多。
编辑要澄清一下,您将永远无法确定给您令牌的人是他们声称的身份。您仅知道服务器是否创建了令牌以及令牌当前是否有效。如果您确实想防止重播攻击(即,绝对确保两个人无法同时使用同一令牌),则每次使用一个令牌时都需要生成一个新令牌。如果您保留我上面提到的白名单,那么此重新生成操作将确保每个令牌在使用一次后立即失效。
为了更加自信,您还可以在令牌正文中包含一个jti
声明;这是一个每次生成令牌时都要用随机唯一值填充的字段,以便您可以跟踪收到的jti的值,并且不允许同一令牌多次出现。不过,它与跟踪令牌大致相同。