如何在 Node.js 中使用驗證器應用程式實現雙重認證 (2FA)
了解如何在 Node.js 中使用驗證器應用程式、TOTP 和 otplib 庫實現雙重認證 (2FA)。這個逐步指南涵蓋從生成 QR 碼到驗證驗證碼的所有內容。
什麼是雙重認證 (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 Authenticator 和 Microsoft Authenticator。
實現 TOTP 作為雙重認證的過程包括兩個步驟:
- 將 TOTP 密鑰綁定到用戶。
- 通過相關的 TOTP 密鑰驗證用戶的 TOTP 密碼。
將 TOTP 綁定到用戶的過程如下:
一旦用戶綁定了 TOTP,他們可以用它來進行驗證。過程如下:
如圖所示,在用戶方面,我們使用驗證器應用程式來管理 TOTP 密鑰和生成 TOTP 密碼。在伺服器方面,我們需要支持生成 TOTP 密鑰並驗證用戶發送的 TOTP 密碼。在本文中,我們將使用 otpllib 作為示例來整合伺服器端的 TOTP 相關功能。
使用 otplib 為你的 Node.js 應用程式實現基於 TOTP 的 2FA
假設你的應用程式基於 Express.js,且用戶通過 /sign-in
端點登錄,支持在用戶登錄過程中實現 TOTP 的計劃如下:
- 當用戶未綁定 TOTP 時,以 QR 碼的形式將 TOTP 密鑰發送給用戶,並提示他們綁定 TOTP。
- 當用戶已經綁定 TOTP 時,提示他們驗證 TOTP。
首先,安裝項目的依賴:otplib
和 qrcode
:
接下來,讓我們增強 /sign-in
端點。
根據我們的實現,當用戶未綁定 TOTP 時,我們會將一個 QR 碼發送到前端:
用戶使用驗證器應用程式掃描 QR 碼,驗證器應用程式將生成一個 TOTP 密碼並存儲相關的 TOTP 密鑰。
用戶將獲得的 TOTP 密碼傳回應用伺服器。如果密碼驗證成功,我們就可以將此 TOTP 綁定到用戶。
因此,讓我們實現一個 /verify-totp
API 來接收用戶發送的 TOTP 密碼:
這樣,我們成功地為用戶綁定了 TOTP。隨後,當用戶登錄時,他們只需要打開驗證器應用程式,發送與之前綁定的 TOTP 密鑰相對應的驗證碼,即可完成身份驗證過程。
在 /verify-totp
API 中,我們使用之前綁定給用戶的 TOTP 密鑰來驗證 TOTP 密碼。
總結
根據本文,你應該能夠為你的應用集成驗證器應用程式驗證。
然而,這只是一個簡單的例子。當你的應用程序大型或預計變得複雜時,集成新的身份驗證方法可能會產生成本。
好消息是:Logto 作為一個全面的身份認證解決方案提供商,提供了多因素認證 (MFA) 支持,包括驗證器應用程式驗證。利用 Logto,你可以在短短幾分鐘內無縫將安全高效的用戶登入過程與 MFA 集成到你的應用程式中!