我一直在尝试在nodejs中开发一个相当简单的服务器。基本上,我要的是一个需要身份验证的简单API(简单的用户名/密码样式)。我所做的不需要的是任何类型的前端功能(模板等)。我的问题是,我似乎无法理解快递/节点的方法。
具体来说,我的问题是:
app.use(express.bodyParser())
)如何工作?它们是否会改变request
或response
对象的内容?具体来说,如果我使用主体解析器(内部强大?),我应该在哪里访问应该解析的请求数据?正如我之前提到的,我认为我的问题最终是节点中面向功能的方法的困难(同样,我在网络服务编程方面的经验相当有限)。如果您知道我可以阅读有关如何构建nodejs应用程序的资源,请不要犹豫,请指出。
答案 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那样,我的意思是它不会死。
最终,您是否知道我可以使用的开源应用程序 看一眼?我想看到一些简单的东西 认证,甚至可能利用强大,因为上传一个 文件是我的要求之一。
答案 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,我建议您使用Restify或booster
对于身份验证(与授权不同),请使用标准Basic,express.basicAuth()
可以处理它只是为了解析它并将其放在{{ 1}}对象。就个人而言,我不喜欢req
,因为如果没有登录,它会返回basicAuth
,而身份验证的过程与确定身份验证是否是不同的
要进行更高级的身份验证以及会话管理,请使用cansecurity或passport。对于授权,您可以在每个路径中放置单个中间件,使用cansecurity的中间件,或使用其声明性授权。
披露:我是助推器和无人机安全的作者。
答案 3 :(得分:0)
如果您的目标是在Node.js中构建RESTful API,我最好的选择是Restify,它使用类似Express的路由,但是会消除所有高级内容(模板等)。 )和广告后端功能(即:身体解析器,ip黑名单,每小时请求)。
对于身份验证部分,我可能会使用另一个库,并将其连接到特定路由。还有ORM可以解决您的数据库需求(mongo和mysql都得到了很好的支持,无论是对于“noSQL”粉丝还是经典的db aproach粉丝)。