У меня есть небольшое приложение, которое использует экспресс.Чтобы пользователь мог отправить данные формы, он должен войти в систему. При входе в систему он получает веб-токен json, который должен быть передан промежуточному программному обеспечению для проверки того, что он может отправить форму.
IУ меня проблемы с отправкой JWT промежуточному программному обеспечению auth.
Авторизация, когда пользователь входит в систему и затем отправляется на страницу для отправки формы, выглядит следующим образом:
router.post('/auth', async (req, res, next) => {
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).send('Invalid email or password.');
const validPassword = await bcrypt.compare(req.body.password, user.password);
if (!validPassword) return res.status(400).send('Invalid email or password.');
const token = user.generateAuthToken();
res.set({'x-auth-token': token }).render('../views/index/form', { 'x-auth-token': token })
;});
маршрут для отправки формы выглядит следующим образом:
router.post('/rates', auth, async (req, res) => {
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let rates = new Rates({
// deleted to save space
});
rates = await rates.save();
res.send(rates);
});
Как вы можете видеть, чтобы отправить сообщение, сначала нужно пройти через промежуточное ПО аутентификации, которое выглядит так:
const config = require('config');
const jwt = require('jsonwebtoken');
function auth(req, res, next) {
const token = req.header('x-auth-token');
if (!token) return res.status(401).send('Access denied. No token provided.')
try {
const decoded = jwt.verify(token, config.get('jwtPrivateKey'));
req.user = decoded;
next();
}
catch (ex) {
res.status(400).send('Invalid token.');
}
}
module.exports = auth;
Я получаю «Доступ запрещен. Токен не предоставлен».каждый раз.Когда я делаю почтовый запрос к ставкам в Почтальоне и устанавливаю там заголовки, он работает нормально.
Я отправляю данные этой формы через страницу, созданную с помощью экспресс-руля.Я не уверен, что я использую res.set неправильно, или что-то теряется, когда визуализируется представление формы руля?
Я могу видеть x-auth-токен, когда я вхожу в интерфейс, перенаправляюсь на страницу формы и просматриваю заголовки в Chrome Inspector.Но как только я пытаюсь отправить данные формы для ставок во внешнем интерфейсе, токен аутентификации теряется и он не работает в промежуточном программном обеспечении аутентификации.
Должно быть что-то, чего я просто не вижу.
Вот мой код на странице, которая отправляет данные формы:
<script>
var formElement = document.querySelector("form");
var header = XMLHttpRequest.getResponseHeader("x-auth-token");
var xhr = new XMLHttpRequest();
xhr.open('POST', '/rates', true);
xhr.setRequestHeader("x-auth-token", header);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function() {
if(this.readyState == XMLHttpRequest.DONE && this.status = 200) {
console.log("success");
} else {
console.log("error sending")
}
}
xhr.send(new FormData(formElement));
</script>