我试图做一个基于令牌的身份验证。在发生任何请求之前,我一直坚持运行身份验证。例如,下面的代码是获取用户,但是一个中间件应检查请求是否具有有效令牌。
app.js
var user = require('./controllers/user');
app.use('/api', user);
user.js的
var express = require('express');
var router = express.Router();
router.get('/user', function(req, res) {
User.find({}, function(err, users) {
res.json(users);
});
});
module.exports = router;
我的逻辑是here,但我不知道放在哪里。
答案 0 :(得分:0)
将中间件置于一切之前:)
var app = express();
function myCustomMiddleware(req, res, next) {
if(/**something we need **/) {
req.haveWhatWeNeed = true;
}
return next();
}
app
.use(myCustomMiddleware)
.get(/*** everything you want***/)
;
答案 1 :(得分:0)
您可以在定义任何路由之前定义中间件,以确保它们在被路由处理之前执行。
答案 2 :(得分:0)
在你的app.js中注册令牌认证中间件,快递' app.use()之前任何路线。
这样,每次调用后定义的路由时,都会执行令牌认证。基本上app.use(身份验证)与app.use(' *',身份验证)相同,这意味着中间件是针对所有域执行的,而不仅仅是针对' / api&# 39;
auth.js
module.exports = function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
};
app.js
var express = require("express");
var app = module.exports = express();
// put the middleware before any routes in app.use()
var authentication = require("./middleware/auth");
app.use(authentication);
var user = require('./controllers/user');
app.use('/api', user);
如果您想让代币只检查' / api'路由,然后使用
定义身份验证app.use('/api', authentication, user);
app.use()以给定的顺序运行作为参数给出的函数。
答案 3 :(得分:0)
我从您的问题中了解到,在执行路由代码之前,您需要进行中间件检查。
var middlewareFunction = function(req, res, next) {
// check header or url parameters or post parameters for token
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// decode token
if (token) {
// verifies secret and checks exp
jwt.verify(token, app.get('superSecret'), function(err, decoded) {
if (err) {
return res.json({ success: false, message: 'Failed to authenticate token.' });
} else {
// if everything is good, save to request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
}
制作中间件功能,并在路线中添加此功能..
var express = require('express');
var router = express.Router();
router.get('/user', middlewareFunction, function(req, res, next) {
User.find({}, function(err, users) {
res.json(users);
});
});
module.exports = router;
我希望这能解决你的问题。