有关验证JWT令牌的问题

时间:2019-03-06 16:15:57

标签: javascript node.js express jwt

我有一个快速的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 / register而不是调用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 :(得分:0)

为什么要发明轮子?有一个NPM模块: express-jwt

它具有检查jwt的中间件,如果它有效,它将解码有效负载并将其添加到请求中,然后再发送到您的控制器(如果它无效,它会引发一个错误,您应该捕获该错误并执行所需的操作。

它具有unless功能,因此您可以将整个子路径配置为受限的,除非它是/register

router.use(`admin/`, [
  expressJwt({ secret: jwtSecret }).unless({
    path: ['/register]
  }),
]);