如何在 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 代码: