Как передать дополнительные данные и проверить, действителен ли токен с помощью JWT - PullRequest
0 голосов
/ 06 августа 2020

Я только начал проект, в котором мне нужно использовать 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 для проверки пользователя при входе в систему и, похоже, он работает (проверено с помощью Почтальон)

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, например, я могу легко установить дополнительные функции, такие как имя пользователя вошедшего в систему пользователя, и когда мне нужно знать, какое имя пользователя вошедшего в систему пользователя, я могу взять его из сеанса

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
          });
        });
    },
}

I думал, что могу добавить его в 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 для подписи . Может ли кто-нибудь подсказать мне, как правильно хранить и получать такие данные и использовать их при необходимости, пока у пользователя все еще есть действующий токен, чтобы оставаться в системе?

1 Ответ

0 голосов
/ 06 августа 2020

Вы добавляете свои данные в параметры, а не в полезную нагрузку.

    if (result) {
            results.password = undefined;
            results.user_id = XXXXXXXX //get somehow

            const jsontoken = sign({ result: results }, process.env.JWT_KEY, {
              expiresIn: "1h"
            });
      ...
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...