如何在 Node.js 上创建 OTP 流程系统(一步一步)

发布: (2026年1月16日 GMT+8 21:56)
4 min read
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本(除代码块和 URL 之外),我将把它翻译成简体中文并保持原有的 Markdown 格式。

🚀 您将构建的内容

  • 用于 请求/发送 OTP 的端点
  • 用于 验证 OTP 的端点
  • 基础用户模型(内存/数据库)
  • 可配置的发送者(Email/SMS)

📦 第一步 — 安装与设置

创建一个新的 Node.js 项目并安装所需的依赖:

mkdir auth-verify-otp
cd auth-verify-otp
npm init -y
npm install express auth-verify dotenv

创建一个 .env 文件以存储敏感配置:

PORT=3000
EMAIL_HOST=smtp.gmail.com
EMAIL_USER=me@example.com
EMAIL_PASS=yourEmailPassword
EMAIL_PORT=yourEmailPort

提示:对于 Gmail,请生成应用专用密码(推荐使用,而不是使用真实密码)。

📧 第2步 — 配置 OTP 发送者

index.js 中设置 auth-verify 并配置电子邮件发送者。OTP 管理器会自动处理生成、存储、冷却时间、过期等功能。

require('dotenv').config();
const express = require('express');
const AuthVerify = require('auth-verify');

const app = express();
app.use(express.json());

// Initialize auth-verify
const auth = new AuthVerify();

// Configure email sender
auth.otp.sender({
  via: 'email',
  host: process.env.EMAIL_HOST,
  sender: process.env.EMAIL_USER,
  pass: process.env.EMAIL_PASS,
  port: process.env.EMAIL_PORT
});

📮 第三步 — OTP 请求路由

当用户访问 /send-otp 时,生成 OTP 并通过电子邮件发送。

app.post('/send-otp', async (req, res) => {
  try {
    const { email } = req.body;

    await auth.otp.send(email, {
      otpLen: 5, // length of OTP code
      subject: "Account verification",
      text: `Your OTP code is ${auth.otp.code}`
    });

    return res.json({ message: 'OTP sent!' });
  } catch (err) {
    console.error(err);
    return res.status(500).json({ error: 'Failed to send OTP' });
  }
});

auth.otp.code 包含发送给用户的生成代码。

🔍 第4步 — OTP 验证

创建一个路由来验证用户输入的 OTP。

app.post('/verify-otp', async (req, res) => {
  try {
    const { email, code } = req.body;

    const isValid = await auth.otp.verify(email, code);

    if (!isValid) {
      return res.status(400).json({ verified: false, message: 'Invalid or expired OTP' });
    }

    return res.json({ verified: true, message: 'OTP verified successfully!' });
  } catch (err) {
    return res.status(500).json({ error: 'Verification error' });
  }
});

auth.otp.verify() 返回 truefalse,让你可以相应地分支你的逻辑。

🔄 第5步 — 可选:冷却与重新发送逻辑

为了防止垃圾信息和暴力破解,auth-verify 支持冷却时间。发送 OTP 后,用户必须等待才能再次请求。

auth.otp.cooldown('30s'); // cooldown before OTP can be resent
auth.otp.resend('user@example.com');

冷却逻辑同时保护用户体验和安全。

🧠 背后发生了什么

步骤功能描述
OTP 生成创建安全的随机数字代码
设置器将 OTP 绑定到标识符(邮箱/电话)
发送器通过邮箱/SMS 发送代码
验证器将提交的代码与存储的代码进行比对
冷却防止垃圾信息和暴力破解攻击

所有这些繁重的工作都已内置于 auth-verify,因此您无需手动生成令牌、管理过期或实现冷却逻辑。

🏁 最终思考

从头构建一次性密码(OTP)系统涉及多个环节——生成令牌、安全发送、存储/过期代码以及验证它们。像 auth-verify 这样的库简化了整个过程,让你可以专注于业务逻辑,而不是繁琐的样板代码。

现在,你的注册和登录流程只需少量路由即可支持安全的 OTP 验证!

Back to Blog

相关文章

阅读更多 »

NodeJS 101 — 第2部分 MySQL

🚀 使用 JavaScript Node.js Express 构建 API 完整的 RESTful API 开发指南,使用 Node.js、Express、Sequelize 和 MySQL! https://media2.dev.to/dynam...