了解如何使用NodeJS创建一个简单的后端

时间:2013-09-03 16:25:45

标签: javascript node.js authentication express

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

具体来说,我的问题是:

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

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

4 个答案:

答案 0 :(得分: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
}
  

使用身份验证时,我拥有存储在a中的凭据   数据库,提供有关各个客户关联的更多信息,   我在什么时候提取这些信息?即,当用户登录时   在,我是否在登录时获取用户记录并将其传递,或者我是否获取   它在每个需要信息的处理程序中?

我认为您应该像使用任何其他服务器端语言一样进行操作。保持用户的状态(已记录/未记录)在会话中。您也可以保留用户的ID并为他提取任何您需要的数据。这取决于您的情况,但您可以缓存信息。因为节点不像PHP那样,我的意思是它不会死。

  

最终,您是否知道我可以使用的开源应用程序   看一眼?我想看到一些简单的东西   认证,甚至可能利用强大,因为上传一个   文件是我的要求之一。

是的。我写了一篇关于真正简单的MVC网站和管理面板的文章。它可用here。它的代码是here

答案 1 :(得分: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

(调整您的会话中间件)

答案 2 :(得分:1)

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

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

要进行更高级的身份验证以及会话管理,请使用cansecuritypassport。对于授权,您可以在每个路径中放置单个中间件,使用cansecurity的中间件,或使用其声明性授权。

披露:我是助推器和无人机安全的作者。

答案 3 :(得分:0)

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

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