Невозможно получить токен JWT в промежуточном программном обеспечении - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь использовать токены JWT в проекте, над которым я сейчас работаю. Я пытаюсь использовать промежуточное ПО для проверки токена JWT перед передачей его следующему обработчику. Однако у меня есть странная проблема: я не получаю токен JWT в промежуточном программном обеспечении, но если я передаю его следующему обработчику, я получаю токен. Надеемся, что приведенный ниже пример объяснит это:

Я реализовал метод PING и некоторые записи, чтобы показать вам, что происходит. Моя настройка выглядит так:

this._express.use((req, res, next) => {
    console.log('AUTH');
    return jwt.verify(req.headers['x-access-token'], 'mysecret', (err, decoded) => {
        if (err) {
            console.log(`ERROR: ${err}`);
            return false;
        }

        console.log('DECODED');
        return next();
    });
});

//Health Check
this._express.get('/ping', (req, res) => {
    console.log(`PING`);
    return res.status(200).send('pong');
});

Если я выполню этот кусок кода, вывод будет:

node_1        | AUTH
node_1        | ERROR: JsonWebTokenError: jwt must be provided

Однако, если я использую обратный вызов next () в промежуточном программном обеспечении:

this._express.use((req, res, next) => {
    console.log('AUTH');
    next(); // This is the only thing that is different
    return jwt.verify(req.headers['x-access-token'], 'mysecret', (err, decoded) => {
        if (err) {
            console.log(`ERROR: ${err}`);
            return false;
        }

        console.log('DECODED');
        return next();
    });
});

//Health Check
this._express.get('/ping', (req, res) => {
    console.log(`PING`);
    return res.status(200).send('pong');
});

Вывод следующий:

node_1        | AUTH
node_1        | ERROR: JsonWebTokenError: jwt must be provided
node_1        | AUTH
node_1        | PING
node_1        | DECODED

У меня нет большого опыта работы с токенами JWT, и, пожалуйста, извините, если это что-то очевидное.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Так что мне удалось выяснить, в чем проблема. Проблема заключается в CORS. В частности, промежуточное программное обеспечение работает, как и ожидалось, однако из-за CORS отправляется предварительный запрос, который не имеет токена JWT, поэтому в первом примере я получил ошибку. Я обновил промежуточное программное обеспечение, чтобы пропустить предварительные запросы:

    if (req.headers['access-control-request-headers'] === 'x-access-token') {
        return next();
    }
    [...]
0 голосов
/ 13 ноября 2018

Я предполагаю, что это проблема req.headers['x-access-token'].После вызова next() управление переходит к следующему маршруту конечной точки.Вы должны предоставить JWT в качестве инициалов токена.

...