6

我一直在尝试在 nodejs 中开发一个相当简单的服务器。基本上,我要的是一个需要身份验证的简单 API(简单的用户名/密码样式)。我不需要的是任何类型的前端功能(模板等)。我的问题是,我似乎无法理解 express/node 的方法。

具体来说,我的问题是:

  • 如何进行身份验证?我是否将多个处理程序传递到需要身份验证的每条路由中,还是有更优雅的方法来做到这一点?
  • Express 中间件(如app.use(express.bodyParser()))如何工作?他们会改变requestorresponse对象的内容吗?具体来说,如果我使用正文解析器(内部强大?),我在哪里访问应该解析的请求数据?
  • 例如,当使用身份验证时,我将凭据存储在数据库中,其中包含有关关联的单个客户端的更多信息,我应该在什么时候提取该信息?即,当用户登录时,我是在登录时获取用户记录并将其传递,还是在每个需要信息的处理程序中获取它?
  • 最后,你知道我可以看看的开源应用程序吗?我希望看到具有简单身份验证甚至可能使用强大功能的东西,因为上传文件是我的要求之一。

正如我之前提到的,我相信我的问题最终是节点中面向函数的方法的困难(另外,我在 web 服务编程方面的经验相当有限)。如果您知道我可以阅读有关如何构建 nodejs 应用程序的资源,请不要犹豫,向我指出它。

4

4 回答 4

4

如何进行身份验证?我是否将多个处理程序传递到需要身份验证的每条路由中,还是有更优雅的方法来做到这一点?

您应该使用会话中间件。这是一些伪代码:

var http = require('http');
var app = express();

var authorize = function(req, res, next) {
    if(req.session && req.session.appname && req.session.appname === true) {
        // redirect to login page
        return;
    }
    next();
}

app.use(express.session());
app.all('/admin*', authorize, function(req, res, next) {

});

Express 中间件(如 app.use(express.bodyParser()))如何工作?他们会改变请求或响应对象的内容吗?具体来说,如果我使用正文解析器(内部强大?),我在哪里访问应该解析的请求数据?

每个中间件都可以访问请求和响应对象。所以,是的,它修改了它。通常将属性附加到它。这意味着在您的处理程序(也是一个中间件)内部,您可以编写:

if(req.body && req.body.formsubmitted && req.body.formsubmitted === 'yes') {
    var data = {
        title: req.body.title,
        text: req.body.text,
        type: req.body.type
    }
    // store the data
}

例如,当使用身份验证时,我将凭据存储在数据库中,其中包含有关关联的单个客户端的更多信息,我应该在什么时候提取该信息?即,当用户登录时,我是在登录时获取用户记录并将其传递,还是在每个需要信息的处理程序中获取它?

我认为您应该以与任何其他服务器端语言相同的方式来做这些事情。将用户的状态(已登录/未登录)保留在会话中。您还可以保留用户的 id 并为他获取任何您需要的数据。这取决于您的情况,但您可以缓存信息。例如,因为 node 不像 PHP,我的意思是它不会死。

最后,你知道我可以看看的开源应用程序吗?我希望看到具有简单身份验证甚至可能使用强大功能的东西,因为上传文件是我的要求之一。

是的。我写了一篇关于带有管理面板的非常简单的 MVC 网站的文章。它可以在这里找到。它的代码在这里

于 2013-09-03T17:05:15.263 回答
1

一种实现身份验证的简单方法(如果您不想使用其他模块):

var checkAuth = function(req, res, next) {
  if(!req.session.user)
  {
    // Redirect to login form
    res.redirect("/login");
  }
  else
  {
    // Proceed to member's area
    next();
  }
};

app.get("/member/page", checkAuth, function(req, res) {
  // render view, etc
});

bodyParser将 POST 请求的主体解析/转换为对象,这有助于获取表单提交值。

处理您的登录表单提交的路由可以像这样访问用户名/密码:

var username = req.body.username;
var password = req.body.password;

此时,您将查询数据库以从用户名和密码匹配的用户中进行选择(您希望在生产环境中使用密码加密)。

如果您在查询结果中返回记录,请在会话中设置它。一个简单的方法是:

req.session.user = userRecord

(调整您的会话中间件)

于 2013-09-03T17:08:36.587 回答
1

如果您正在寻找 REST,我建议您使用Restifybooster

对于身份验证(与授权不同),使用标准 Basic,express.basicAuth()只需解析它并将其放置在req对象上即可处理。就个人而言,我不喜欢basicAuth,因为401如果没有登录它会返回 a,而身份验证的过程与确定是否需要身份验证不同。

对于更高级的身份验证以及会话管理,请使用cansecuritypassport。对于授权,您可以在每个路由中放置单独的中间件,使用 cansecurity 的中间件,或者使用它的声明式授权。

披露:我是 booster 和 cansecurity 的作者。

于 2013-09-04T04:29:30.897 回答
0

如果您的目标是在 Node.js 中构建 RESTful API,我最好的选择是Restify,它使用类似 Express 的路由方法,但消除了所有高级内容(模板等)和广告后端功能(即:正文解析器、ip 黑名单、每小时请求数)。

对于身份验证部分,我可能会使用另一个库,并将其连接到特定路由。也有 ORM 可以解决您的数据库需求(mongo 和 mysql 得到很好的支持,无论是“noSQL”粉丝还是经典的 db 方法)。

于 2013-09-03T16:38:01.263 回答