Вам нужны и JWT, и Passport в приложении Node? - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь понять процесс аутентификации при входе пользователя в приложение MERN, которое я создаю. Так много учебных пособий, которые я вижу, используют оба passport с jwt, и мне трудно понять, почему я использовал бы оба вместе вместо одного или другого. Я предпочел бы использовать jwt, но если есть причина не делать этого, я буду использовать passport или оба.

Например, вот маршрут /login, который возвращает jwt пользователю:

app.post('/login', (req, res, next) => {
  let query = { email: req.body.email };
  let entered_password = req.body.password;

  User.findOne(query, (err, user) => {
    if (err) { console.log(err); }
    if (!user) {
      return res.json({ message: "Invalid authorization" });
    }

    // returned from user object stored in mongodb
    let bcrypted_password = user.password;

    // put password entered on login page through bcrypt and compare it to the hashed password
    bcrypt.compare(entered_password, bcrypted_password, (error, isMatch) => {
      if (error) { console.log(error); }
      else {

        if (isMatch) {

          // passwords match, so create a jwt token for user
          jwt.sign({ email: req.user.email },
            process.env.JWT_KEY,
            { expiresIn: "24h" },
            (jwt_err, token) => {

            if (jwt_err) {
              return res.sendStatus(402);
            }

            else {
              // token created, now return it to user
              return res.json({ token });
            }
          });
        }

        else { // passwords do not match
          return res.json({ message: "Invalid authorization" });
        }
      }
    });
  });
});

Этот jwt возвращается пользователю и сохраняется в localStorage. Затем, когда пользователь пытается получить доступ к защищенному маршруту, я отправляю токен и получаю промежуточное ПО verifyToken, чтобы проверить, действителен ли токен:

const verifyToken = (req, res, next) => {
  let token = req.body.token;
  jwt.verify(token, process.env.JWT_KEY, (err, authData) => {
    if(err) {
      res.json({ message: "Authentication failed" });
    }
    else {
      // verification worked
      next();
    }
  });
}

Я что-то пропустил? Что-то не так с этим? Каковы преимущества / недостатки использования jwt с или без passport?

1 Ответ

0 голосов
/ 06 января 2020

Я использую подход, описанный вами в этом посте, и не нашел необходимости использовать паспорт.

Passprt не требуется, хотя людям может быть легче начать работу (и, возможно, избежать проблем с безопасностью).

Если вы компетентны, тогда приемлемо нестандартное решение. Лично я помещаю подписанный JWT UserId в cook ie, проверяю его с помощью промежуточного программного обеспечения и затем добавляю его в объект запроса (делая его доступным с req.userId В отличие от req.body)

...