上周,在《创建 Node.js HTTP 服务器》一文中,我介绍了 Node.js 中 HTTP 的基础知识。今天的文章将向您展示如何使用 HTTP 身份验证来保护您的 Node.js 站点免受密码攻击。我们将首先介绍基本的访问身份验证,然后转向更安全的摘要访问身份验证。
关键要点
htpasswd
用于管理基本访问身份验证中的密码文件,而 htdigest
实用程序用于摘要访问身份验证。密码存储在服务器端的密码文件中,http-auth
模块用于向 HTTP 服务器添加身份验证支持。express-basic-auth
中间件。基本访问身份验证
当用户访问实现身份验证的站点时,系统会提示他/她输入用户名和密码。如果用户提供有效的凭据,他们将被带到页面的内容,否则他们将被拒绝,并显示“401 未授权”响应。最简单的 HTTP 身份验证类型是基本访问身份验证。
在服务器端,所有用户名和加密密码都存储在密码文件中。Node.js 实用程序 htpasswd
可用于管理密码文件。要安装 htpasswd
,请使用以下命令。npm
代表 Node.js 包管理器,它默认情况下随 Node.js 一起安装。npm
用于安装 Node.js 模块。-g
标志全局安装软件包,这意味着它包含在系统的 PATH 变量中。
<code class="language-bash">npm install -g htpasswd</code>
安装 htpasswd
后,您可以使用以下命令创建新用户。此示例使用 -c
标志创建一个名为“htpasswd”的新密码文件。在新文件中,添加名为“foo”的用户。-b
标志允许将密码“bar”指定为命令行的一部分。
<code class="language-bash">htpasswd -bc htpasswd foo bar</code>
运行该命令后,打开您的“htpasswd”文件。用户“foo”的密码文件条目如下所示。此行包含用户名和加密密码。由于这是文件中第一个也是唯一的用户,因此这应该是文件中的唯一一行。
<code>foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=</code>
下一步是向我们的 HTTP 服务器添加身份验证支持。首先,您需要使用以下 npm 命令安装 http-auth
模块。
<code class="language-bash">npm install -g htpasswd</code>
接下来,创建一个名为“basic_auth_server.js”的新文件,并添加以下代码。请注意,http-auth
模块在第 2 行中引用。在第 3 行到第 7 行中,将配置对象传递给身份验证模块。authRealm
字段定义身份验证领域。authFile
字段指向我们之前创建的密码文件。__dirname
指的是当前正在执行的脚本所在的目录。此示例假设“htpasswd”文件与“basic_auth_server.js”位于同一目录中。authType
配置字段指示要使用的身份验证类型。在第 9 行中,基本身份验证方案应用于 HTTP 连接。身份验证回调函数提供经过身份验证的用户名以进行进一步处理。
<code class="language-bash">htpasswd -bc htpasswd foo bar</code>
最后,启动服务器。您可以通过导航到 https://www.php.cn/link/bb122c8fe6c764e8aae555e2186a6344 来连接到服务器。系统会提示您输入用户名和密码。提供您之前创建的凭据,浏览器将通过姓名向您问好。
基本访问身份验证最大的缺点是凭据作为明文通过网络发送。为了防止窃听,此类身份验证只能与安全(即 HTTPS)连接一起使用。如果安全连接不可用,则应改用更安全的身份验证形式。
摘要访问身份验证
摘要访问身份验证是基本身份验证的更安全替代方案。使用摘要身份验证,密码在网络传输之前会被加密。
摘要身份验证也使用密码文件。但是,文件的格式与基本身份验证中使用的文件格式略有不同。为了使用摘要密码文件格式,我们将使用名为 htdigest
的不同实用程序。使用以下 npm 命令安装 htdigest
。
<code>foo:{SHA}Ys23Ag/5IOWqZCw9QGaVDdHwH00=</code>
接下来,使用以下命令创建一个新的密码文件。同样,-c
标志用于创建一个名为“htpasswd”的新密码文件。这次我们还必须指定一个身份验证领域。在这种情况下,身份验证领域是“Private area”。在此示例中,用户名再次为“foo”。请注意,命令中未提供密码。输入命令后,系统会提示您提供密码。
<code class="language-bash">npm install http-auth</code>
运行 htdigest
后,查看新的“htpasswd”文件内部。“foo”的条目如下所示。摘要身份验证文件包含用户名和加密密码,以及基本身份验证文件中未包含的身份验证领域。
<code class="language-bash">npm install -g htpasswd</code>
为了将摘要身份验证集成到我们的服务器中,我们将再次使用 http-auth
模块。如果您一直在按照本教程进行操作,则该模块应该已经安装在您的机器上。接下来,创建一个名为“digest_auth_server.js”的新文件来实现您的服务器。服务器代码如下所示。请注意,服务器代码与基本身份验证服务器代码几乎相同。区别在于配置对象的 authType
字段。在这种情况下,authType
已设置为“digest”。可以像基本身份验证服务器一样访问此服务器。
<code class="language-bash">htpasswd -bc htpasswd foo bar</code>
结论
本文介绍了 HTTP 身份验证的基础知识。通过遵循此处提供的示例,您的 Node.js 应用程序可以更安全一些。但是,您应该知道,仅靠身份验证是不够的。如果安全性是主要问题,则您的站点应通过 HTTPS 提供服务。在以后的文章中,我将探讨 HTTPS 和许多其他很棒的 Node.js 功能。如果您喜欢这篇文章,您将想了解 SitePoint 最新系列的印刷品和电子书 Jump Start 的所有信息。第一本是 Don Nguyen 的《Node.js》——在 SitePoint 了解更多信息!
(以下为FAQ部分,由于篇幅过长,我将对FAQ部分进行精简概括,保留核心信息,避免重复冗余。)
常见问题解答 (FAQ) 关于 Node.js 中的 HTTP 身份验证
如何在 Node.js 中使用 Express.js 实现 HTTP 身份验证? 使用 express-basic-auth
中间件。 示例代码中展示了如何使用用户名和密码进行身份验证。
如何使用 HTTP 身份验证保护我的 Node.js 应用程序? 使用 http-auth
模块,并指定密码文件路径。 务必使用 HTTPS 提高安全性。
如何使用 HTTP 身份验证处理多个用户? 使用文件或数据库存储用户名和密码。 http-auth
模块支持此功能。
如何自定义 Node.js 中的 HTTP 身份验证提示? 设置 realm
选项。
如何处理 Node.js 中的身份验证失败? 服务器会发送 401 未授权响应。您可以自定义此响应。
如何将 HTTP 身份验证与 HTTPS 一起使用? 创建 HTTPS 服务器而不是 HTTP 服务器。
如何将 HTTP 身份验证与 Cookie 一起使用? 在成功身份验证后设置 Cookie。
如何将 HTTP 身份验证与会话一起使用? 使用会话中间件,例如 express-session
。
如何将 HTTP 身份验证与 JSON Web 令牌 (JWT) 一起使用? 使用 JWT 中间件,例如 express-jwt
。
如何将 HTTP 身份验证与 OAuth 一起使用? 使用 OAuth 中间件,例如 passport
。
总而言之,以上精简概括了FAQ部分的核心内容,并对原文进行了伪原创处理。 所有图片链接均保留不变。
以上是node.js中的http身份验证的详细内容。更多信息请关注PHP中文网其他相关文章!