【问题标题】:How to pass extra data and check if token is valid with JWT如何传递额外数据并检查令牌是否对 JWT 有效
【发布时间】:2020-11-26 10:48:26
【问题描述】:

我刚开始一个项目,我必须使用 Node + 一些与之相关的东西,我感到有点困惑! 我使用 JWT 进行身份验证,特别是我这样创建了我的项目:

api
 |---teams
      |----teams.controller.js
      |----teams.router.js
      |----teams.service.js
 |---users (same as team)
auth
 |---token_validation.js
other things
 |---other things

我使用 token_validation.js 让 JWT 在登录时验证用户,并且似乎可以正常工作(通过 Postman 验证)

const jwt = require("jsonwebtoken");

module.exports = {
  checkToken: (req, res, next) => {
    let token = req.get("authorization");
    if (token) {
      // Remove Bearer from string
      token = token.slice(7);
      jwt.verify(token, process.env.JWT_KEY, (err, decoded) => {
        if (err) {
          console.log("err: " + err);
          return res.json({
            success: 0,
            message: "Invalid Token..."
          });
        } else {
          req.decoded = decoded;
          next();
        }
      });
    } else {
      // other code
    }
  }
};

我需要在数据库(MariaDB)中插入一个新团队,用户可以在登录后创建一个新团队。我的问题是,在 Java 中使用 Session 时,例如我可以轻松设置登录用户的用户名等附加信息,当我需要知道登录用户的用户名是什么时,我可以从会话中获取它

String username = (String) session.getAttribute("username");

我不明白如何对 Node/JWT 做同样的事情。我需要做的是,登录后我需要保存 user_id,当用户创建新团队时,我需要将 user_id 与其他数据一起发送到数据库(如果令牌仍然有效)。

const {
    create
} = require("./teams.service");

module.exports = {
    createTeam: (req, res) => {
        const body = req.body;

       // here I need to check if token still valid
       // if yes -> take user id and send it to DB with
       // other data

        create(body, (err, results) => {
          if (err) {  // if fails
            // handle
          }
          return res.status(200).json({ // success
            success: 1,
            data: results
          });
        });
    },
}

我想我可以在用户登录时将其添加到 user.controller.js 中:

    if (result) {
            results.password = undefined; 
            const jsontoken = sign({ result: results }, process.env.JWT_KEY, {
              expiresIn: "1h",
              user_id: get somehow //error
            });
   // other code
   }

但它给了我一个错误,告诉我我无法添加 user_id 来签名。谁能告诉我存储和获取此类数据的正确方法,并在用户仍然拥有有效令牌以保持登录状态时在需要时使用它们?

【问题讨论】:

    标签: node.js authentication jwt


    【解决方案1】:

    最好的选择是在 localStorage 中设置它。当您请求后端发送带有标头的请求时,然后在后端检查令牌是否有效并使用您想要的数据发送响应。

    【讨论】:

      【解决方案2】:

      您正在将数据添加到选项中,而不是有效负载。

          if (result) {
                  results.password = undefined;
                  results.user_id = XXXXXXXX //get somehow
      
                  const jsontoken = sign({ result: results }, process.env.JWT_KEY, {
                    expiresIn: "1h"
                  });
            ...
         }
      

      【讨论】:

      • 如果我这样做,var userId = result.user_id;登录后如何在需要时获取此 var?
      • jwt.verifynpmjs.com/package/…
      猜你喜欢
      • 2021-08-06
      • 2020-07-04
      • 1970-01-01
      • 2020-06-05
      • 2019-11-09
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多