【问题标题】:Understanding how to use NodeJS to create a simple backend了解如何使用 NodeJS 创建简单的后端
【发布时间】:2013-09-03 16:25:45
【问题描述】:

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

具体来说,我的问题是:

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

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

【问题讨论】:

    标签: javascript node.js authentication express


    【解决方案1】:

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

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

    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 网站的文章。它是可用的here。它的代码是here。

    【讨论】:

    • 感谢分享那篇文章!我刚开始阅读它,这几乎是我希望的那种资源!
    【解决方案2】:

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

    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
    

    (针对您的会话中间件进行调整)

    【讨论】:

    • 好的,我想这就是我想要的那种身份验证。只是一个问题,请求是否总是必须包含用户名/密码?有没有一种简单的方法来设置一个 cookie 进行检查(并对其进行加密签名,否则你可能会放弃整个身份验证)?
    • 只有登录表单提交请求发送用户名和密码。您使用 Express cookieSession。
    【解决方案3】:

    如果您正在寻找 REST,我建议您使用 Restify 或 booster

    authentication(区别于authorization),使用标准Basic,express.basicAuth()可以处理,只是解析后放到req对象上.就个人而言,我不喜欢basicAuth,因为如果没有登录,它会返回401,而身份验证 的过程不同于确定身份验证是否是必要 .

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 2018-02-03
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2020-03-26
        • 1970-01-01
        相关资源
        最近更新 更多