前言
某天,突然想到怎么去做一个验证码校验功能呢?怎么校验正确与否呢?
回想起,在n多年前第一家公司实习时有一个手机发送验证码的需求,随后后端同学出了一个点子。在前端发送验证码请求之后,直接返回发出去的验证码,然后前端直接对比用户输入的验证码和后端返回的验证码是否一致即可。
当时我竟然还觉得挺合理!
正确的方式是怎样的呢?
以下是本人画的发送验证码及校验阶段流程图(简易版)

大致分为如下两个阶段:
发送验证码阶段
发送请求:
用户通过
App
发送包含email
参数的请求。
检查邮箱格式:
如果邮箱格式不正确,拒绝请求。
生成验证码:
如果邮箱格式正确,生成一个验证码。
存储验证码:
将生成的验证码存储到
Redis
,键为邮箱地址,值为验证码。
发送邮件:
如果验证码存储成功,发送包含验证码的电子邮件。
如果邮件发送成功,返回发送成功信息;否则返回发送失败信息。
校验验证码阶段
发送请求:
用户通过
App
发送包含email
和验证码
参数的请求。
检查请求格式:
如果请求格式不正确,拒绝请求。
获取验证码:
从
Redis
中获取存储的验证码。
验证验证码:
如果验证码正确且未过期,返回成功信息和
Token
。如果验证码不正确或已过期,返回验证失败信息。
接下来实践下
使用依赖及工具库
express(nodejs框架)
nodemailer(发送邮件)
redis(存储时效验证码)
dotenv (读取环境变量)
ejs(邮件模板)
非必需(项目启动)
pm2
nodemon
一、安装 Redis
Redis 安装方式就不详细介绍了,直接参考文档地址吧。
Docker 安装 Redis | 菜鸟教程[1]
二、提供编写两个接口
发送验证码
方法:POST
路径:/send-code
参数:
email (string): 接收验证码的邮箱地址
username (string): 用户名称(非必填)
app.post('/send-code', async (req, res) => {
const { email,