我有一个 Node.js 应用程序。我正在使用 Json Web Token 进行授权。当我使用数据库中的用户登录时,它会为该用户创建一个 token 。但我可以将该 token 用于另一个用户,并且它也可以再次工作。我需要为所有用户提供不同的 token ,并且我不应该将一个用户的 token 用于另一用户。 (我的工作电脑上没有互联网,所以我无法在我的电脑上编写代码,对此表示抱歉)
这是我的 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"
});
}
};
这是我的登录代码(我在这里创建 token ) 如果密码为真:
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);
我希望一个 token 只适用于一个用户,并且对于每次登录,它都应该为所有用户创建一个新 token 。有什么建议吗?
最佳答案
您将电子邮件包含在 token 正文中;为什么不将用户 ID 作为声明(字段)包含在内?当您验证 token 时,如果成功,它会将正文返回给您,这样您就知道该 token 是为哪个用户创建的,如果不是发出请求的用户,则拒绝。
为了确保两个人不会同时使用同一个 token ,您可以在生成 token 时以及 token 过期或撤销时(例如,当用户注销时)保留每个有效 token 的列表或报告冒名顶替者,如果它达到了这种程度)将其从列表中删除。验证时,如果token不在列表中,则不用解码,直接拒绝即可。
如果你给你的代币设置相当小的过期窗口(我相信建议是让它们的持续时间不超过 1 小时),你就不必太担心这些事情。
编辑需要澄清的是,您永远无法确定向您提供 token 的人是否是他们声称的人。您只知道您的服务器是否创建了 token 以及 token 当前是否有效。如果您确实想防止重放攻击(即,绝对确保两个人无法同时使用同一个 token ),则每次使用时都需要生成一个新 token 。如果您保留我上面提到的白名单,则此重新生成可确保每个 token 一旦使用一次就变得无效。
为了更加自信,您还可以在 token 正文中包含 jti
声明;这是一个旨在每次生成 token 时填充随机唯一值的字段,以便您可以跟踪收到的 jti,并且不允许相同的值出现多次。不过,这与仅跟踪 token 大致相同。
关于javascript - 如何在 Node JS 中使用 jwt 向所有用户授权不同的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58631123/