Node.js中的RESTful API - 通过授权进行过滤

时间:2016-03-01 09:25:07

标签: javascript node.js api rest express

我有一个Web应用程序和一个RESTful API来与DB通信。 Web应用程序的前端使用Angular HTTP发布/获取/放入后端,后者又处理身份验证,发布/获取/放入api并返回结果。后端通过JWT将自身认证为API的管理员,但使用基于cookie的会话对用户进行身份验证。因此,API在某种程度上是无状态的,但Web服务器使用状态。

我一直在寻找具有授权机制的选项,以根据用户过滤查询结果。例如,我有一个问题端点,我返回一个仅由登录用户公司创建的问题列表。

1-我一直在网络服务器上做(基本上是过滤):

router.get('/questions', passportConf.isAuthenticated, function(req, res) {
    restler.get(process.env.API_URL + '/questions/?organisation=' + req.user.organisation._id).on('complete', function(questions) {
      res.json({
        data: questions
      });
    });
});

2-但是另一个选项是put问题端点嵌套在用户的组织端点下,例如:

/user/organisation/questions

3-或者基本上我可以将用户放在对API的请求主体中,这将根据请求正文中的用户组织进行过滤。

4-最后,我可以在Web服务器上跳过基于cookie的会话auth,从前端直接向API发出请求,并使用JWT对用户进行身份验证(这与在第一点中过滤问题的方法相同)。

我对Node.js相当陌生,我想知道是否有一个模块或通用做法来处理1或4中的特别过滤。

1 个答案:

答案 0 :(得分:-1)

请注意,这只是尝试遵循模式做法的用户的回复。

我一直在使用Express框架。使用express,您可以非常轻松地处理http请求,这是使用Nodejs进行Web开发的最流行的框架之一。

要解决授权问题,我会添加一个可以过滤的中间件(可以是一个函数)。例如,如果router是将处理所有请求并发送回复的路由器的名称,我将在router.js中添加以下代码,该文件将保存所有特定于路由器的逻辑:< / p>

router.use(function isAuthorized(req, res, next){
    // Add your filtering code here
});

在这种情况下,它会是,

router.use(passportConf.isAuthenticated);

使用此一次,路由器中的每次点击都必须通过此中间件。

现在,我们正在尝试合并'GET'请求:

var http = require('http'); //basic node.js module, needed for handling http requests

router.get('/questions', function(req, res) {
    var url = process.env.API_URL;
    var opt = {host: url, path : '/questions/?organisation=' + req.user.organisation._id}
    http.request(opt, function(questions){
        res.json({data: questions});
    }).end();
});