首頁 >web前端 >js教程 >node.js中的http身份驗證

node.js中的http身份驗證

Jennifer Aniston
Jennifer Aniston原創
2025-02-25 15:32:08146瀏覽

HTTP Authentication in Node.js

上週,在《創建 Node.js HTTP 服務器》一文中,我介紹了 Node.js 中 HTTP 的基礎知識。今天的文章將向您展示如何使用 HTTP 身份驗證來保護您的 Node.js 站點免受密碼攻擊。我們將首先介紹基本的訪問身份驗證,然後轉向更安全的摘要訪問身份驗證。

關鍵要點

  • 基本訪問身份驗證和摘要訪問身份驗證是 Node.js 中兩種 HTTP 身份驗證方法。基本訪問身份驗證更簡單,會提示用戶輸入用戶名和密碼,而摘要訪問身份驗證更安全,因為它會在傳輸前加密密碼。
  • Node.js 實用程序 htpasswd 用於管理基本訪問身份驗證中的密碼文件,而 htdigest 實用程序用於摘要訪問身份驗證。密碼存儲在服務器端的密碼文件中,http-auth 模塊用於向 HTTP 服務器添加身份驗證支持。
  • 僅使用 HTTP 身份驗證不足以確保 Node.js 應用程序的安全。為了獲得更好的安全性,它應該通過 HTTPS 提供服務。 Express.js 可用於在 Node.js 中實現 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>

Node.js 集成

下一步是向我們的 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>

Node.js 集成

為了將摘要身份驗證集成到我們的服務器中,我們將再次使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn