Я использовал этот учебник для реализации аутентификации на моем сервере. Для аутентифицированных маршрутов 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);
}
}
);