Проблема с проверкой токена JWT - PullRequest
0 голосов
/ 06 марта 2019

У меня есть экспресс-узел nodejs, в котором есть три функции URL, в которых

1) registerUser () добавил сведения о пользователе в базу данных и предоставил JWT для вызывающей стороны

2) verifyToken ()- проверяет, является ли JWT действительным

3) getConfiguration () - если JWT проверен сверху, функция предоставляет пользователю некоторые данные конфигурации

Так что экспресс-код, который я использую для достижения этой цели,

//Routes.js

app.use(requestIp.mw())

app.route('/register')
    .post(userController.registerUser);

app.use(userController.verifyToken)

app.route('/user/configuration')
    .post(chayakkadaController.getConfiguration);

Теперь моя проблема - всякий раз, когда я пытаюсь вызвать URL / регистр вместо вызова функции registerUser, она вызывает verifyToken и говорит, что мой токен недействителен (я хочу, чтобы функция registerUser работала без токена, но getConfiguration должна работать толькос токеном)

Это моя функция verifyToken

export function verifyToken(req, res, next) {
var token = req.body.token || req.headers["token"];
var appData = {};
if (token) {
    jwt.verify(token, process.env.SECRET_KEY, function (err, decoded) {
        if (err) {
            appData["status"] = 1;
            appData["error"] = "Invalid Token";
            res.status(500).json(appData);
        } else {
            req.user = decoded;
            next();
        }
    });
} else {
    appData["status"] = 1;
    appData["error"] = "Need access token";
    res.status(403).json(appData);
}
}

Мой регистр Код пользователя

export function registerUser(req, res) {
let userData = {
    device: req.body.device,
    device_version: req.body.device_version,
    device_id: req.body.device_id,
    app_version: req.body.app_version,
    app_id: 2,
    ip_address: req.headers['x-real-ip'] || req.connection.remoteAddress
}
database.query(`INSERT INTO users SET ?`, userData)
    .then(result => {
        let user = {
            id: result.insertId
        }
        let token = jwt.sign(user, process.env.SECRET_KEY);
        let appData = {};
        appData["token"] = token;
        redis.sendMessage({
            qname: 'registration_queue',
            message: result.insertId + '',
        }, (err, resp) => {
            res.status(201).json(appData);
        });

    })
    .catch(err => {
        console.log(err);
        res.status(500).json("Database Error");
    })
}

1 Ответ

0 голосов
/ 06 марта 2019

Почему ты хочешь изобрести колесо? для этого есть модуль NPM: экспресс-JWT

У него есть промежуточное ПО, которое проверяет jwt, если оно допустимо , оно декодирует полезную нагрузку и добавляет его к запросу, после чего оно поступает на ваш контроллер, если оно недействительно, он выдает ошибку, которую вы должны поймать, и делать то, что вы хотите.

Он имеет функцию unless, поэтому вы можете настроить весь подпуть как ограниченный, если он не /register

router.use(`admin/`, [
  expressJwt({ secret: jwtSecret }).unless({
    path: ['/register]
  }),
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...