【问题标题】:RESTful API in Node.js - Is Filtering Possible With AuthorizationNode.js 中的 RESTful API - 是否可以通过授权进行过滤
【发布时间】:2016-03-01 09:25:06
【问题描述】:

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

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

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 发出的请求正文中,这将根据请求正文中的用户组织进行过滤。

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

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

【问题讨论】:

  • 我假设restler是路由器?还是nodejs应用的名字?
  • @sarker306 它是一个 HTTP 客户端库。 github.com/danwrong/restler 该块在路由器本身中,将组织信息添加到对 API 的请求中。

标签: javascript node.js api rest express


【解决方案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();
});

【讨论】:

  • 这并不能远程回答我的问题,API_URL 以api.ABC.com 开头基本上是我网络中的其他一些虚拟机,我不明白添加斜杠如何让我的生活更轻松。
  • 基本上,如果您使用 Express,我试图证明您不需要使用其他模块来处理 http 请求。重新加载以获取更新的响应。
  • 我不是在“处理”一个 HTTP 请求,而是在向我的 API 服务器“发出”一个 HTTP 请求。
  • 很抱歉,这与我的授权问题无关。我使用restler是有原因的,在您发布的示例中,您使用'http'模块来发出请求。无论如何,我很感激你试图回答我的问题,但我的问题不是如何提出请求。
  • 好吧,既然如此,我应该问您是否愿意让您的 Web 服务器无状态,就像 API 一样?在这种情况下,使用 JWT 会有所帮助。据我了解,选项 4 将要求您在请求标头“x-access-token”中发送访问令牌,并在服务器端对其进行解码以找到相应的用户(如果有)。在该步骤之后,您可以将解码的用户添加到请求中,并继续过滤。如果这是你想要的,我可以更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多