Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的RESTful API-可以通过授权进行过滤吗_Javascript_Node.js_Api_Rest_Express - Fatal编程技术网

Javascript Node.js中的RESTful API-可以通过授权进行过滤吗

Javascript Node.js中的RESTful API-可以通过授权进行过滤吗,javascript,node.js,api,rest,express,Javascript,Node.js,Api,Rest,Express,我有一个web应用程序和一个RESTful API与DB通信。web应用程序的前端使用Angular HTTP将/gets/puts发送到后端,后者依次处理身份验证、将/gets/puts发送到api并返回结果。后端通过JWT将自己验证为API的管理员,但使用基于cookie的会话验证用户。因此,在某种程度上,API是无状态的,但web服务器使用状态 我一直在寻找具有授权机制的选项,以根据用户筛选查询结果。例如,我有一个questions端点,其中我返回一个仅由登录用户的公司创建的问题列表 1-

我有一个web应用程序和一个RESTful API与DB通信。web应用程序的前端使用Angular HTTP将/gets/puts发送到后端,后者依次处理身份验证、将/gets/puts发送到api并返回结果。后端通过JWT将自己验证为API的管理员,但使用基于cookie的会话验证用户。因此,在某种程度上,API是无状态的,但web服务器使用状态

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

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-但是,另一个选项是嵌套在用户组织端点下的put questions端点,例如:

/user/organisation/questions
3-或者基本上我可以将用户放在向API发出的请求正文中,API将根据请求正文中用户的组织进行过滤

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


我是Node.js的新手,我想知道在1或4中是否有一个模块或常见的实践来处理特别的过滤。

请注意,这只是一个试图遵循模式实践的用户的响应

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

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

router.use(function isAuthorized(req, res, next){
    // Add your filtering code here
});
在这种情况下,应该是,

router.use(passportConf.isAuthenticated);
使用一次,路由器中的每一次点击都必须通过这个中间件

现在,我们正在尝试合并“获取”请求:

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

我假设restler是路由器?或者是nodejs应用程序的名称?@sarker306它是一个HTTP客户端库。该块位于路由器本身,将组织信息添加到向API发出的请求中。这并不能远程回答我的问题,API_URL从我的网络中的其他虚拟机开始,我不知道添加斜杠如何让我的生活更轻松。基本上,我试图证明,如果您使用Express,您不需要使用其他模块来处理http请求。重新加载以获得更新的响应。我没有处理HTTP请求,我正在向我的API服务器发出HTTP请求。很抱歉,这与我的授权问题无关。我使用restler是有原因的,在您发布的示例中,您使用“http”模块发出请求。我很感激你试图回答我的问题,但我的问题不是如何提出请求。那么,在这种情况下,我应该问你是否愿意让你的web服务器成为无状态的,就像API一样?在这种情况下,使用JWT会有所帮助。据我所知,选项4将要求您在请求头x-access-token中发送访问令牌,并在服务器端对其进行解码以找到相应的用户(如果有)。在该步骤之后,您可以将解码的用户添加到请求中,并继续过滤。如果这是你想要的,我可以更新我的答案。