2016-03-01 46 views
0

我有一个Web应用程序和一个RESTful API来与数据库进行通信。 Web应用程序的前端使用Angular HTTP发布/获取/放入后端,后者依次处理身份验证,发布/获取/放入api并返回结果。后端通过JWT将自己认证为API的管理员,但使用基于cookie的会话对用户进行身份验证。所以,API是无状态的,但Web服务器使用状态。Node.js中的RESTful API - 通过授权进行筛选

我一直在寻找一些选项,以使用授权机制来过滤基于用户的查询结果。例如,我有一个问题终端,我返回只由登录用户的公司创建的问题列表。

1 - 我一直在做的Web服务器上(基本上过滤):

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-然而,另一种选择是将问题用户组织端点下终结点嵌套,如:

/user/organisation/questions 

3-或者基本上我可以把用户放在对API的请求中,这个请求会根据请求主体上的用户组织进行过滤。最后,我可以跳过Web服务器上基于cookie的会话身份验证,直接从前端向API发送请求,并使用JWT验证用户身份(这与第一点中的问题过滤方式相同)。

我是相当新的Node.js的,我想知道如果有一个模块或一种常见的做法,以处理1或4

+0

我认为restler是路由器?或者是nodejs应用程序的名称? – sarker306

+0

@ sarker306它是一个HTTP客户端库。 https://github.com/danwrong/restler该块位于路由器本身中,将组织信息添加到对API所做的请求中。 –

回答

-1

特别过滤请注意,这仅仅是从谁拥有用户的响应试图遵循模式实践。

我一直在使用Express框架。使用express,你可以很容易地处理http请求,这是使用Nodejs进行web开发的最流行的框架之一。

为了解决授权问题,我会添加一个中间件(可以是一个函数),它将使过滤成为可能。例如,如果router是将处理所有的请求和发送回复路由器的名字,我会添加以下代码在router.js,所有的路由器的特定逻辑将被保存的文件:

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(); 
}); 
+0

这不能远程回答我的问题,并且API_URL以http://api.ABC.com开头。基本上它是我的网络中的一些其他虚拟机,我看不出如何添加斜线会使我的生活更轻松。 –

+0

基本上我试图证明你不需要使用另一个模块来处理http请求,如果你使用的是Express。重新加载以获取更新的响应。 – sarker306

+0

我不是“处理”一个HTTP请求,而是向我的API服务器“发出”一个HTTP请求。 –