如何在Node JS中使用jwt为所有用户授予不同的令牌

时间:2019-10-30 17:49:22

标签: javascript node.js authentication jwt authorization

我有一个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);

我希望一个令牌只能用于一个用户,并且对于每次登录,它都应该为所有用户创建一个新令牌。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您正在将电子邮件包含在令牌正文中;为什么还不将用户ID包括在声明中(字段)?当您验证令牌时,如果令牌成功,它将把正文返回给您,因此您将知道令牌是为哪个用户创建的,如果不是发出请求的用户,则将拒绝它。

为确保两个人不会同时使用同一令牌,您可以在生成有效令牌,令牌过期或撤销(例如,用户退出时)时保留每个有效令牌的列表或举报冒名顶替者(如果冒充者行之有效),将其从列表中删除。在验证过程中,如果令牌不在列表中,则甚至不必费心对其进行解码,只需立即将其拒绝即可。

如果您给令牌赋予适当的较小的有效期窗口(我相信建议使令牌的使用期限不超过1小时),则不必担心太多。

编辑要澄清一下,您将永远无法确定给您令牌的人是他们声称的身份。您仅知道服务器是否创建了令牌以及令牌当前是否有效。如果您确实想防止重播攻击(即,绝对确保两个人无法同时使用同一令牌),则每次使用一个令牌时都需要生成一个新令牌。如果您保留我上面提到的白名单,那么此重新生成操作将确保每个令牌在使用一次后立即失效。

为了更加自信,您还可以在令牌正文中包含一个jti声明;这是一个每次生成令牌时都要用随机唯一值填充的字段,以便您可以跟踪收到的jti的值,并且不允许同一令牌多次出现。不过,它与跟踪令牌大致相同。