0

我有一个使用 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) {
         ...

我怎样才能在更高的层次上做到这一点?我可以在全局的某个地方设置这个标题要求吗?我想基本上对除了用户登录功能之外的所有功能都这样做,所以除了一个之外的所有功能。

4

3 回答 3

1

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

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.get("/user/info", verifyUser, exports.info)

关于选择的请求:

app.all(SomeRegex, verifyUser)

在所有请求中:

app.use(verifyUser)
于 2013-02-25T19:04:19.743 回答
0

只需将您的函数添加为在所有请求处理之前运行的快速中间件之一。

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');

你调用 next 让 express 像往常一样处理,或者你使用重定向,或者返回错误并且不调用 next。

于 2013-02-25T19:02:36.810 回答
0

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

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);
于 2013-02-25T19:03:47.410 回答