Как авторизовать всех пользователей с разными токенами, используя jwt в Node JS - PullRequest
0 голосов
/ 30 октября 2019

У меня есть приложение node.js. Я использую Json Web 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"
    });
  }
};

А вот мой код для входа (я создаю токен здесь), если пароль верен:

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 Ответ

1 голос
/ 30 октября 2019

Вы включаете электронную почту в свое тело токена;почему бы не включить идентификатор пользователя в качестве заявки (поле)? Когда вы проверите токен, если он успешен, он вернет вам тело, так что вы будете знать, для какого пользователя был создан этот токен, и отклоните его, если это не тот, кто делает запрос.

Комучтобы два человека не использовали один и тот же токен одновременно, вы можете хранить список всех действительных токенов при его создании, а также по истечении срока действия токена или его отзыве (например, когда пользователь выходит из системы или сообщает о мошеннике), если он зашел так далеко) удалите его из списка. Во время проверки, если токена нет в списке, даже не пытайтесь расшифровать его, просто немедленно отклоните его.

Если вы дадите своим токенам прилично небольшие окна истечения срока действия (я полагаю, рекомендуется сделать их последнимине более 1 часа), вам не нужно сильно беспокоиться о таких вещах.

РЕДАКТИРОВАТЬ Чтобы уточнить, у вас никогда не будет способа узнать наверняка, что человек, которыйдал вам знак того, кем они себя называют. Вы знаете только, если ваш сервер создал токен и токен в настоящее время действителен. Если вы действительно хотите предотвратить повторные атаки (то есть убедитесь, что два человека не могут использовать один и тот же токен одновременно), вам нужно будет генерировать новый токен при каждом его использовании. Если вы сохраните этот белый список, который я упоминал выше, эта регенерация гарантирует, что каждый токен станет недействительным, как только он будет использован один раз.

Вы также можете, ДОПОЛНИТЕЛЬНО быть уверенным, включить в тело токена утверждение jti;это поле предназначено для заполнения случайным уникальным значением каждый раз, когда генерируется токен, так что вы можете отслеживать полученные jti и не допускать, чтобы один и тот же входил более одного раза. Это примерно то же самое, что просто отслеживать токены.

...