我有一个快速的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");
})
}
答案 0 :(得分:0)
为什么要发明轮子?有一个NPM模块: express-jwt
它具有检查jwt的中间件,如果它有效,它将解码有效负载并将其添加到请求中,然后再发送到您的控制器(如果它无效,它会引发一个错误,您应该捕获该错误并执行所需的操作。
它具有unless
功能,因此您可以将整个子路径配置为受限的,除非它是/register
router.use(`admin/`, [
expressJwt({ secret: jwtSecret }).unless({
path: ['/register]
}),
]);