在Node.js中实现邮箱验证码的发送与验证
在实际开发中,可能会遇到注册时提供邮箱验证码的需求。在Node.js中是可以实现的。以下分享一些我的开发经验。
开发环境
- Node.js
- Express
- Mongoose
- MongoDB
邮箱验证码思路
验证码发送阶段
客户端上传邮箱地址到服务端,服务端通过生成随机验证码,并将这个验证码发送到用户上传的这个邮箱中。此时服务端需要将这个邮箱和验证码保存到数据库的某张表中(后文中使用Code来称呼这个表),同时保证这条记录的唯一性。并在有效时间内将这条记录删除(此时间就是验证码的有效时间)
验证码验证阶段
客户端将收到的验证码和邮箱重新发送到服务端,服务端开始验证:
- 是否能够从Code中查询到这条验证码和邮箱与客户端发送一致的记录
- 是:验证通过,并删除这条记录
- 否:验证不通过
验证码发送阶段
安装
安装提供发送邮件的模块:nodemailer
、nodemailer-smtp-transport
1 | npm i nodemailer nodemailer-smtp-transport -save |
使用
引入发送邮件的模块
1 | const nodemailer = require('nodemailer') |
创建连接对象
1 | const transport = nodemailer.createTransport(smtpTransport({ |
host:如果发件使用sina邮箱的话就填写 smtp.sina.com;qq邮箱同理
secure:如果为true,则连接到服务器时连接将使用TLS。如果为false(默认值),则在服务器支持STARTTLS扩展名的情况下使用TLS。在大多数情况下,如果要连接到端口465,请将此值设置为true。对于端口587或25,请将其保留为false
auth:发件人身份验证对象
- user:用户名
- pass:SMTP授权码 (通常在邮箱网站的设置里)
- login:认真类型,默认login(普通用户无需填写这一项)
生成随机验证码函数 及 邮箱验证正则
1 | const randomFns=()=> { // 生成6位随机数 |
建立连接发送验证码
1 | let EMAIL=req.body.e_mail //req为请求体对象 我使用的是post请求方式,所以通过req.body获取用户提交的邮箱 |
验证码发送后的相关工作
接下来需要将这个邮箱和验证码保存到Code中,同时保证这条记录的唯一性。并在5分钟内将这条记录删除
1 | const Code = require("../models/Code") |
发送阶段完整代码
(推荐将其封装为中间件)
1 | module.exports = app=>{ |
验证码验证阶段
验证阶段只需要通过获取用户得邮箱和验证码是否在Code中查询到即可
1 | router.post('/new',async (req,res)=>{ |