Передача заголовка JWT промежуточному ПО авторизации в Express - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть небольшое приложение, которое использует экспресс.Чтобы пользователь мог отправить данные формы, он должен войти в систему. При входе в систему он получает веб-токен 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>
...