如何在 Node.js 上创建 OTP 流程系统(一步一步)
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() 返回 true 或 false,让你可以相应地分支你的逻辑。
🔄 第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 验证!