专栏首页Node Python Go全栈开发短信验证码的简单实现

短信验证码的简单实现

序言


短信验证码是所有 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、验证码校验:查询是否有手机号和验证码同时匹配的数据即可。

本文分享自微信公众号 - Node Python Go全栈开发(gh_9ccbe5e0dfb3),作者:rifewang

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 时序数据库 InfluxDB(六)

    连续查询 Continuous Queries( CQ )是 InfluxDB 很重要的一项功能,它的作用是在 InfluxDB 数据库内部自动定期的执行查询,...

    凌虚
  • 连接池设置

    对后台应用程序而言几乎离不开操作数据库,而操作数据库绝对是要跟连接池 pool 打交道的。

    凌虚
  • Go 十秒钟了解 PMG 模型

    对于高并发,现代操作系统早就有了多进程和多线程,然而它们本身也是有缺点的。进程是独占资源的基本单元,操作系统创建、销毁进程是非常消耗资源的。线程存在于进程中,是...

    凌虚
  • 原来验证码是为了对抗黑客

    年关将至,一场世界级的社会壮举又将上演,那就是咱们的春运,短短的十几天将搬运30亿人次的客流,让国外的记者和看客们都不得不佩服咱们伟大祖国的交通运输能力。为了准...

    程序员互动联盟
  • 使用Java制作验证码

      验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Hu...

    端碗吹水
  • 短信验证码“最佳实践”

      年初,从外地转移阵地到西安,转眼已两个多月。很久不写业务代码了,到了新公司,条件恶劣到前所未有,从需求,设计,架构,实现,实施,测试,bug修复,项目计划制...

    guokun
  • 小小验证码,作用可真不小!

    我们在开发用户登录功能的时候,总是会被要求加一个验证码的功能!那么,为什么要加这个验证码?验证码有什么作用?常见的验证码有哪些?

    Java旅途
  • 写给爬虫工程师的验证码识别教程

    但是对于一个爬虫工程师来说,去学习 机器学习相关知识可能成本太高了.(当然有空的话,还是要好好学的)

    爬虫
  • 登录注册表单渗透

    大家在甲方授权的渗透测试中,经常会遇到各种表单:登录、注册、密码修改、密码找回等表单,本技术稿着重介绍关于各种表单的渗透经验,抛砖引玉,欢迎大家交流互动。

    FB客服
  • 【实战篇】记一次登陆窗口的漏洞挖掘

    注:有时候重放报文提示“验证码错误”,还可尝试直接删除整个验证码字段,看是否报错。

    一名白帽的成长史

扫码关注云+社区

领取腾讯云代金券