繁體中文(香港)
  • mfa
  • 2fa
  • totp
  • nodejs
  • security
  • authentication
  • authenticator app
  • otplib

如何在 Node.js 中使用驗證器應用程式實現雙重認證 (2FA)

了解如何在 Node.js 中使用驗證器應用程式、TOTP 和 otplib 庫實現雙重認證 (2FA)。這個逐步指南涵蓋從生成 QR 碼到驗證驗證碼的所有內容。

Yijun
Yijun
Developer

Stop wasting weeks on user auth
Launch secure apps faster with Logto. Integrate user auth in minutes, and focus on your core product.
Get started
Product screenshot

什麼是雙重認證 (2FA)

在傳統應用程式中,我們通常使用電子郵件/用戶名/電話作為身份標識符。通過將這些身份標識符與對應的密碼或驗證碼結合,我們可以完成身份驗證的過程。

然而,在安全要求更高的情況下,僅依賴身份標識符進行身份驗證是不夠的。這是因為這些身份標識符及其對應的驗證資訊可能容易洩露。

這就是雙重認證 (2FA) 的用武之地 - 一種額外的安全層,要求用戶提供兩個不同的驗證因素來驗證身份,確保嘗試訪問帳戶的是真正的合法用戶。

常見的 2FA 方法包括:

  • 使用驗證器應用程式的 TOTP 認證
  • 生物識別認證
  • 基於設備的認證
  • 短訊驗證碼

在本教程中,我們將專注於使用 otplib 庫在你的 Node.js 應用程式中實現基於 TOTP 的 2FA。

什麼是 TOTP 認證?

TOTP 代表基於時間的一次性密碼。如維基百科所述,它是一種計算機算法,可生成使用當前時間作為唯一性來源的一次性密碼 (OTP)。

當用戶的手機與應用伺服器之間共享 TOTP 密鑰時,用戶的手機和應用伺服器可以在同一時間點生成相同的 TOTP 密碼:

由於 TOTP 生成依賴時間,因此可以離線計算。此外,TOTP 生成一個數字字串,使其簡單且易於使用。因此,驗證 TOTP 常被用作雙重認證的一種方法。

當用戶使用 TOTP 作為雙重認證方法時,他們往往會遇到存儲 TOTP 密鑰和生成 TOTP 密碼的挑戰。這就是驗證器應用程式大派用場的地方。我們可以使用驗證器應用程式來存儲 TOTP 密鑰,驗證器應用程式會自動為你生成 TOTP 密碼。在需要驗證時,你只需打開驗證器應用程式,就會獲得與 TOTP 密鑰對應的 TOTP 密碼。流行的驗證器應用程式包括 Google AuthenticatorMicrosoft Authenticator

實現 TOTP 作為雙重認證的過程包括兩個步驟:

  1. 將 TOTP 密鑰綁定到用戶。
  2. 通過相關的 TOTP 密鑰驗證用戶的 TOTP 密碼。

將 TOTP 綁定到用戶的過程如下:

一旦用戶綁定了 TOTP,他們可以用它來進行驗證。過程如下:

如圖所示,在用戶方面,我們使用驗證器應用程式來管理 TOTP 密鑰和生成 TOTP 密碼。在伺服器方面,我們需要支持生成 TOTP 密鑰並驗證用戶發送的 TOTP 密碼。在本文中,我們將使用 otpllib 作為示例來整合伺服器端的 TOTP 相關功能。

使用 otplib 為你的 Node.js 應用程式實現基於 TOTP 的 2FA

假設你的應用程式基於 Express.js,且用戶通過 /sign-in 端點登錄,支持在用戶登錄過程中實現 TOTP 的計劃如下:

  1. 當用戶未綁定 TOTP 時,以 QR 碼的形式將 TOTP 密鑰發送給用戶,並提示他們綁定 TOTP。
  2. 當用戶已經綁定 TOTP 時,提示他們驗證 TOTP。

首先,安裝項目的依賴:otplibqrcode

接下來,讓我們增強 /sign-in 端點。

根據我們的實現,當用戶未綁定 TOTP 時,我們會將一個 QR 碼發送到前端:

綁定 TOTP

用戶使用驗證器應用程式掃描 QR 碼,驗證器應用程式將生成一個 TOTP 密碼並存儲相關的 TOTP 密鑰。

Google Authenticator

用戶將獲得的 TOTP 密碼傳回應用伺服器。如果密碼驗證成功,我們就可以將此 TOTP 綁定到用戶。

因此,讓我們實現一個 /verify-totp API 來接收用戶發送的 TOTP 密碼:

這樣,我們成功地為用戶綁定了 TOTP。隨後,當用戶登錄時,他們只需要打開驗證器應用程式,發送與之前綁定的 TOTP 密鑰相對應的驗證碼,即可完成身份驗證過程。

驗證 TOTP

/verify-totp API 中,我們使用之前綁定給用戶的 TOTP 密鑰來驗證 TOTP 密碼。

總結

根據本文,你應該能夠為你的應用集成驗證器應用程式驗證。

然而,這只是一個簡單的例子。當你的應用程序大型或預計變得複雜時,集成新的身份驗證方法可能會產生成本。

好消息是:Logto 作為一個全面的身份認證解決方案提供商,提供了多因素認證 (MFA) 支持,包括驗證器應用程式驗證。利用 Logto,你可以在短短幾分鐘內無縫將安全高效的用戶登入過程與 MFA 集成到你的應用程式中!