Node.js 在顶层验证头文件

Node.js 在顶层验证头文件,node.js,express,Node.js,Express,我有一个使用Express.js框架构建的Node.js应用程序。 我想检查用户是否有权执行某个请求,我通过要求客户端在报头中提供访问令牌来实现这一点。 我不想将此添加到客户端可以访问的每个单独函数中。与此类似,对于有关用户的信息请求: exports.info = function(req, res) { var userId = req.params.id, accessToken = req.headers["accesstoken"]; console.l

我有一个使用Express.js框架构建的Node.js应用程序。 我想检查用户是否有权执行某个请求,我通过要求客户端在报头中提供访问令牌来实现这一点。 我不想将此添加到客户端可以访问的每个单独函数中。与此类似,对于有关用户的信息请求:

exports.info = function(req, res) {
    var userId = req.params.id,
        accessToken = req.headers["accesstoken"];
    console.log("received request to get info for userID <"+ userId +">");
    users.User.findOne({accessToken: accessToken}, function(err, user) {
        if(user == null) {
         ...
exports.info=函数(请求、恢复){
var userId=req.params.id,
accessToken=req.headers[“accessToken”];
log(“收到获取用户ID信息的请求”);
users.User.findOne({accessToken:accessToken},函数(err,User){
if(user==null){
...
我如何在更高的级别上执行此操作?我是否可以在global for express的某个位置设置此标题要求?
我想对除用户登录功能之外的所有功能基本上都这样做,所以除了一个功能之外的所有功能都要这样做。

只需将您的功能添加为在所有请求处理之前运行的另一个express中间件

app.use(function(req, res, next) {
    var userId = req.params.id,
        accessToken = req.headers["accesstoken"];
    console.log("received request to get info for userID <"+ userId +">");
    users.User.findOne({accessToken: accessToken}, function(err, user) {
        if(user != null) {
            return next();  // This is ok, keep processing
        } else {
            // don't call next, redirect to login page, etc...
        }
}

app.get('/home', ...);
apg.get('/some_other_page');
app.use(函数(请求、恢复、下一步){
var userId=req.params.id,
accessToken=req.headers[“accessToken”];
log(“收到获取用户ID信息的请求”);
users.User.findOne({accessToken:accessToken},函数(err,User){
如果(用户!=null){
return next();//没问题,继续处理
}否则{
//不调用下一步,重定向到登录页面等。。。
}
}
app.get('/home',…);
apg.get('/some_other_page');

您可以调用“下一步”让express像往常一样进行处理,或者使用重定向,或者返回错误而不调用“下一步”。

您可以创建一个中间件并在每个路由上设置它,您需要进行授权。例如:

var myAuthMiddleware = function (req, res, next) {

    // Here goes your code to check if the user complies
    // with the conditions. You can use req.headers, req.user, etc

    if (conditionIsMet) return next();  // If the user complies, you continue the process

    // The user doesn't comply
    return res.send('Error');
}
然后,在需要的路径中使用他的中间件:

app.get('/my-route', myAuthMiddleware, myRouteHandler);
app.post('/another-route', myAuthMiddleware, myOtherRouteHandler);
// This one doesn't need auth
app.get('/', indexHandler);

您可以制作一个小型中间件:

verifyUser = function(req,res,next){
  var userId = req.params.id, accessToken = req.headers["accesstoken"];
  console.log("received request to get info for userID <"+ userId +">");
  users.User.findOne({accessToken: accessToken}, function(err, user) {
    if(user == null) {
      ...
    }

     next()
  }
}
关于一系列请求:

app.all(SomeRegex, verifyUser)
在所有重新请求上:

app.use(verifyUser)
app.use(verifyUser)