javascript - 如何在 Node JS 中使用 jwt 向所有用户授权不同的 token

标签 javascript node.js authentication jwt authorization

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

相关文章:

authentication - WEKA 中加速度计缺失数据和分类

javascript - 对一个元素调用 .each

node.js - Google CSE REST API : is v1 deprecated, 有 v2 吗?

node.js - Jasmine (mocha) 嵌套 "it"测试

python - 在本地使用 Google Cloud Platform 客户端库时如何确定身份验证方法

javascript - 将背景滑入和滑出 View

javascript - Meteor 中长度为 0 的非空数组

javascript - 在弹出窗口的父窗口中打开 iframe 的链接

javascript - 如何修复自动图像移动

java - android应用程序中如何处理域认证?