短信验证码的简单实现

简介: 短信验证码的简单实现

序言



短信验证码是所有 APP 必不可少的基础功能模块之一,这篇文章将会简单的实现这一功能。


短信接口平台



收发短信必须要借用通信运营商的通道,而不少短信接口平台通过自身与通信运营商对接并对外提供简单高效的 API 接口为广大的软件开发者提供了更加快捷优质的服务。


对于短信接口平台,我这里将其分为两种:


第一种,验证码由软件开发者(即短信接口平台的用户)提供,短信接口平台不会保存和处理验证码,也就是说验证码的校验过程需要由开发者处理;


另一种,验证码由短信接口平台提供,同时其会提供另一个负责校验此验证码的接口,即验证码不需要由开发者处理和校验,更加省事方便。


当然,一个短信接口平台是有可能同时提供以上两种接口的,至于具体的短信接口平台公司,这里就不提了。


验证码的存储



这里主要说下上述第一种短信接口的情况,即验证码由我们自己随机生成,并且我们需要将其存储以供后续判断验证码是否正确。


对于验证码的存储又可以分为以下两种:


第一种,验证码存储在服务器端的 session 中(其实随便一个对象都可以),不需要使用数据库资源,但是一旦服务器异常重启,session 中的数据将会全部清空,也就是说验证码一段时间内将会全部失效,同时另外一个必须重视的问题是,我们一定要清除掉 session 中的过期数据,不然其将会不停地占用内存以至于造成内存泄漏的情况。


第二种,验证码存储在数据库中,这样会占用额外的数据库资源,但显然服务器端将会更加轻松,同时不少数据库提供了 TTL ( time to live )的功能,通过设置数据的有效期,数据库将会自动删除掉过期的数据,当然,我们也可以单纯的存储验证码创建或失效的时间,拿取此时间自行判断验证码是否在有效期内。


以我的性格,肯定是用数据库的 TTL ,不用多说。


实现示例



用哪个数据库呢?直接用 mongo 就得了,本身就支持 TTL ,而且项目其它数据的存储也会用 mongo ,所以没有必要为了一个验证码多搞一个 redis 数据库上去,当然如果项目本身就会用 redis 做缓存的情况除外。


服务器端的逻辑过程:

1、接受用户的手机号,进行合法性判断。


2、随机产生 4 位数字验证码。


3、调用短信接口平台的 API 接口,将随机产生的验证码和用户的手机号作为输

入参数,接收此接口的输出并判断短信验证码是否成功发送。


4、将验证码和手机号存入数据库中,并设置 TTL 即验证码的有效时间。


5、校验过程,输入手机号和验证码查询数据库中是否有对应存在的数据。


大致过程就是这样。


具体实现:

1、手机号合法性判断:复杂的,查询三大运营商的合法个人号段,这个太麻烦且实际意义不大,简单一点弄,以 1 开头的 11 位数字即可,正则判断如下图:


2、随机生成验证码:Math.random() 自己去拼接吧。


3、短信平台的接口调用:不同平台接口不同,自己去看官方文档。


4、存储验证码和手机号、设置 TTL 有效时间:

这里用的 mongoose 如下图

注意红色圈出来的部分,在 schema 中 必须定义一个 date 类型的数据,且给其加上索引并设置 expires 即有效时间,实际操作的数据 arr 必须与此 schema 对应( 我在这卡了一整天才踏过了这个坑 ),对于存储则是此手机号若有记录则更新,若没有则直接创建,所以用了 findOneAndUpdate 并且有了最后的红色圈的设置。


5、验证码校验:查询是否有手机号和验证码同时匹配的数据即可。


完。


结束语



不知道写什么结束语,就这样结束吧。

目录
相关文章
|
开发工具 Docker 容器
Docker设置国内镜像源
Docker设置国内镜像源
18557 1
|
消息中间件 安全 API
记项目的一次发送短信及短信模板配置分享
我们日常使用的软件或者网站,大部分都在使用短信业务,比如 注册 、 验证码功能 。还有一些特定的业务需要发送短信通知国内外用户等。有了需求就会有平台提供服务,国内有很多互联网公司都提供短信业务,比如阿里云、腾讯云、七牛。本次我们主要讲解的是阿里云提供的短信服务。
记项目的一次发送短信及短信模板配置分享
|
7月前
|
关系型数据库 MySQL Linux
MySQL8官方YUM仓库使用指南
MySQL 8 是广受欢迎的开源关系数据库管理系统,引入了诸多新特性和性能提升。本文介绍如何在 Linux 上通过 MySQL 官方 YUM 仓库安装和管理 MySQL 8。首先配置 YUM 仓库并安装 MySQL,启动服务后获取临时密码并登录。接着创建数据库与用户,使用 SQL 命令创建表格、插入及查询数据。此方法简便高效,适合快速上手 MySQL 8 的基本操作。
532 13
|
网络协议 JavaScript 安全
深入浅出TCP 与 UDP
深入浅出TCP 与 UDP
228 0
|
存储 NoSQL 关系型数据库
【redis】认识redis和分布式系统
【redis】认识redis和分布式系统
143 1
|
NoSQL Linux 网络安全
Linux系统安装Redis
该博客文章详细介绍了在Linux系统中安装Redis的步骤,包括下载、编译、配置、启动Redis服务以及使用客户端访问Redis数据库的过程。
Linux系统安装Redis
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
307 0
|
安全
C++11中的std::call_once
C++11中的std::call_once
224 0
|
NoSQL Java Redis
Redis 从入门到精通之Redis Pipeline
使用Redis Pipeline可以大大提高Redis的性能和吞吐量,但需要注意命令的顺序和语义,以保证数据的正确性和一致性。同时,使用Jedis和RedisTemplate实现Redis Pipeline时,需要遵循最佳实践,避免出现错误和异常。 2. 在使用Jedis实现Redis Pipeline时,需要使用Pipeline对象添加多个命令并执行,然后通过`syncAndReturnAll`方法获取所有命令的执行结果。 3. 在使用RedisTemplate实现Redis Pipeline时,需要使用`executePipelined`方法添加多个命令并执行,然后通过返回的结果列表获取
979 109
Redis 从入门到精通之Redis Pipeline