Стратегия JWT отправляет вызов API по неверным маршрутам - PullRequest
0 голосов
/ 28 февраля 2020

Я использовал этот учебник для реализации аутентификации на моем сервере. Для аутентифицированных маршрутов GET и DELETE, которые я определил, это работает как шарм. Однако, когда я пытаюсь отправить запрос POST или PATCH на аутентифицированный маршрут, по какой-то странной причине по умолчанию используется первый определенный мной аутентифицированный маршрут, GET-маршрут. Затем я получаю сообщение об ошибке 401 «Cannot GET [маршрут для инициированного мной запроса POST]».

Я использую некоторые обертки вокруг моего вызова в БД, используя ax ios. [Get / post / etc], чтобы установить заголовки / предварительно загрузить URL моей базы данных, и я подтвердил, что заголовки исправить прямо перед тем, как я на самом деле позвоню. В моих инструментах разработки, однако, я не вижу заголовок Авторизация на самом деле go до конца. Я думаю, проблема в том, что мои заголовки не установлены должным образом, но я использую один и тот же шаблон для PATCH и DELETE (единственное отличие заключается в методе ax ios), и заголовки не отображаются в запросе на первое, но сделайте для второго, так что я как бы застрял.

Может кто-нибудь помочь мне разобраться в чем дело?

const ExtractJwt = passportJWT.ExtractJwt;
const JwtStrategy = passportJWT.Strategy;
const jwtOptions = {};
jwtOptions.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
jwtOptions.secretOrKey = 'tasmanianDevil';

passport.use(
  new JwtStrategy(jwtOptions, (jwt_payload, next) => {
    try {
      const { id } = jwt_payload;
      db.User.getUserById(id, (err, user) => {
        if (user) {
          next(null, user);
        } else {
          next(null, false);
        }
      });
    } catch (error) {
      console.warn(error);
    }
  })
);

/// /api/me is defaulted to on POST and PATCH requests

app.get(
  '/api/me',
  passport.authenticate('jwt', { session: false }),
  (req, res) => {
    try {
      const { user } = res.req;
      const response = {
        _id: user._id,
        email: user.email,
        dungeons: user.dungeons,
      };
    } catch (error) {
      console.warn(error);
    }
  }
);

// This route defaults to GET request above

app.post(
  '/api/users/:userID/dungeons/',
  passport.authenticate('jwt', { session: false }),
  (req, res) => {
    try {
      const { userID } = req.params;
      const { dungeonName, equipment } = req.body;
      const newDungeon = new db.Dungeon({
        dungeonName,
        equipment,
      });

      db.User.findById(userID, (err, existingUser) => {
        if (existingUser) {
          if (err) {
            res.status(500).send('Database Error');
          } else {
            const dungeonDoesExist = existingUser.dungeons.find(
              existingDungeon => existingDungeon.dungeonName === dungeonName
            );
            if (!dungeonDoesExist) {
              existingUser.dungeons.push(newDungeon);
              existingUser.save(() => {
                res
                  .status(200)
                  .send(`${dungeonName} added to ${existingUser.email}`);
              });
            } else {
              res
                .status(500)
                .send(`Database Error: ${dungeonName} already exists`);
            }
          }
        } else {
          res.status(404).send('User not found');
        }
      });
    } catch (error) {
      console.warn(error);
    }
  }
);

// DELETE route does work

app.delete(
  '/api/users/:userID/dungeons/:dungeonID',
  passport.authenticate('jwt', { session: false }),
  (req, res) => {
    try {
      const { userID, dungeonID } = req.params;
      db.User.findById(userID, (err, existingUser) => {
        if (existingUser) {
          if (err) {
            res.status(500).send('Database Error');
          } else {
            const dungeonDoesExist = existingUser.dungeons.find(
              existingDungeon => existingDungeon.id === dungeonID
            );
            if (dungeonDoesExist) {
              const foundDungeon = existingUser.dungeons.id(dungeonID);
              foundDungeon.remove();
              existingUser.save((err, savedUser) => {
                res.status(200).send('Dungeon removed');
              });
            } else {
              res.status(404).send('Dungeon not found');
            }
          }
        } else {
          res.status(404).send('User not found');
        }
      });
    } catch (error) {
      console.warn(error);
    }
  }
);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...