Node.js中的HTTP身份验证

上周,在Node.js创建HTTP服务器中 ,我介绍了Node.js中HTTP的基础知识。 今天的文章将向您展示如何使用HTTP身份验证来密码保护Node.js站点。 我们将从研究基本访问身份验证开始,然后继续进行更安全的摘要访问身份验证。

基本访问身份验证

当用户访问实现身份验证的站点时,将提示他/她输入用户名和密码。 如果用户提供了有效的凭据,则会将其带到页面的内容,否则将以“ 401未经授权”的响应被拒绝。 HTTP身份验证的最简单类型是基本访问身份验证

密码文件

在服务器端,所有用户名和加密密码都存储在密码文件中。 Node.js实用程序htpasswd可用于管理密码文件。 要安装htpasswd ,请使用以下命令。 npm代表Node.js软件包管理器 ,默认情况下与Node.js一起安装。 npm用于安装Node.js模块。 -g标志在全局范围内安装软件包,这意味着它已包含在系统的PATH变量中。

npm install -g htpasswd

安装htpasswd ,您可以使用下面显示的命令创建新用户。 本示例使用-c标志创建一个名为“ htpasswd”的新密码文件。 在新文件中,添加了一个名为“ foo”的用户。 -b标志允许将密码“ bar”指定为命令行的一部分。

htpasswd -bc htpasswd foo bar

运行命令后,打开“ htpasswd”文件。 用户“ foo”的密码文件条目如下所示。 此行包含用户名和加密密码。 由于这是文件中的第一个也是唯一的用户,因此这应该是文件中的唯一行。

foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=

Node.js合并

下一步是向我们的HTTP服务器添加身份验证支持。 首先,您需要使用以下npm命令安装http-auth模块。

npm install http-auth

接下来,创建一个名为“ basic_auth_server.js”的新文件,并添加以下代码。 请注意,第2行引用了http-auth模块。在第3至7行中,将配置对象传递给身份验证模块。 authRealm字段定义身份验证领域。 authFile字段指向我们之前创建的密码文件。 __dirname是指当前正在执行的脚本所在的目录。本示例假定“ htpasswd”文件与“ basic_auth_server.js”位于同一目录中。 authType配置字段指示要使用的身份验证类型。 在第9行,基本身份验证方案应用于HTTP连接。 身份验证回调函数提供经过身份验证的用户名,以供进一步处理。

var http = require("http");
var auth = require("http-auth");
var basic = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "basic"
});
var server = http.createServer(function(request, response) {
  basic.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});

server.listen(80);
console.log("Server is listening");

最后,启动服务器。 您可以通过导航到http://localhost来连接到服务器。 系统将提示您输入用户名和密码。 提供您之前创建的凭据,浏览器将通过按名称向您打招呼进行响应。

局限性

基本访问身份验证的最大缺点是凭证通过网络以纯文本形式发送。 此类身份验证仅应与安全(即HTTPS)连接一起使用,以防止窃听。 如果没有安全连接,则应使用更安全的身份验证形式。

摘要访问认证

摘要访问身份验证是基本身份验证的一种更安全的替代方法。 使用摘要式身份验证,可以在网络传输之前对密码进行加密。

密码文件

摘要式身份验证还使用密码文件。 但是,该文件的格式与用于基本身份验证的格式略有不同。 为了使用摘要密码文件格式,我们将使用另一个名为htdigest实用程序。 使用以下npm命令安装htdigest

npm install -g htdigest

接下来,使用下面显示的命令创建一个新的密码文件。 同样, -c标志用于创建名为“ htpasswd”的新密码文件。 这次我们还必须指定一个身份验证领域。 在这种情况下,认证领域是“私有区域”。 在此示例中,用户名再次为“ foo”。 请注意,该命令未提供密码。 输入命令后,将提示您提供密码。

htdigest -c htpasswd "Private area" foo

运行htdigest ,查看新的“ htpasswd”文件。 “ foo”的条目如下所示。 摘要身份验证文件包含用户名和加密密码以及身份验证领域,该身份验证领域未包含在基本身份验证文件中。

foo:Private area:b8e1b1c08abcd38173a7dba3ad93a0c3

Node.js合并

要将摘要身份验证合并到我们的服务器中,我们将再次使用http-auth模块。 如果您一直按照本教程进行操作,则该模块应该已经安装在您的计算机上。 接下来,创建一个名为“ digest_auth_server.js”的新文件以实现您的服务器。 服务器代码如下所示。 请注意,服务器代码与基本身份验证服务器代码几乎相同。 区别在于配置对象的authType字段。 在这种情况下, authType已设置为"digest" 。 可以使用与基本身份验证服务器相同的方式访问此服务器。

var http = require("http");
var auth = require("http-auth");
var digest = auth({
  authRealm: "Private area",
  authFile: __dirname + "/htpasswd",
  authType: "digest"
});
var server = http.createServer(function(request, response) {
  digest.apply(request, response, function(username) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello " + username);
    response.end();
  });
});

server.listen(80);
console.log("Server is listening");

结论

本文介绍了HTTP身份验证的基础知识。 通过遵循此处提供的示例,您的Node.js应用程序可以更加安全。 但是,您应该意识到仅凭身份验证是不够的。 如果安全是主要问题,则应通过HTTPS为您的站点提供服务。 在以后的文章中,我将探索HTTPS和许多其他很棒的Node.js功能。

如果您喜欢这篇文章,那么您将想要了解有关SitePoint最新的印刷和电子书系列Jump Start的全部信息 。 第一个标题是Don Nguyen的Node.js-SitePoint上了解更多

From: https://www.sitepoint.com/http-authentication-in-node-js/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值