短信验证码逻辑分析
总结
保存短信验证码是为注册做准备的。
为了避免用户使用图形验证码恶意测试,后端提取了图形验证码后,立即删除图形验证码。
Flask不具备发送短信的功能,所以我们借助第三方的容联云通讯短信平台来帮助我们发送短信验证码。
短信验证码后端逻辑
短信验证码接口设计
短信验证码接口定义
1 @api.route("/sms_codes/<re(r'1[34578]\d{9}'):mobile>")
2 def get_sms_code(mobile):
3 """获取短信验证码"""
短信验证码后端逻辑实现
1 @api.route("/sms_codes/<re(r'1[34578]\d{9}'):mobile>")
2 def get_sms_code(mobile):
3 """获取短信验证码"""
4 # 1.获取参数
5 # 2.校验参数
6 # 3.业务逻辑处理
7 # 4.返回值
避免频繁发送短信验证码逻辑分析
存在的问题:
虽然我们在前端界面做了60秒倒计时功能。
但是恶意用户可以绕过前端界面向后端频繁请求短信验证码。
解决办法:
在后端也要限制用户请求短信验证码的频率。60秒内只允许一次请求短信验证码。
在Redis数据库中缓存一个数值,有效期设置为60秒。
避免频繁发送短信验证码逻辑分析
避免频繁发送短信验证码逻辑实现
提取、校验send_flag
1 try:
2 send_flag = redis_store.get("send_sms_code_%s" % mobile)
3 except Exception as e:
4 logging.error(e)
5 else:
6 if send_flag is not None:
7 # 表示在60秒内之前有过发送的记录
8 return jsonify(errno=RET.REQERR, errmsg="请求过于频繁,请60秒后重试")
重新写入send_flag
1 try:
2 redis_store.setex("sms_code_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
3 # 保存发送给这个手机号的记录,防止用户在60s内再次出发发送短信的操作
4 redis_store.setex("send_sms_code_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
5 except Exception as e:
6 logging.error(e)
7 return jsonify(errno=RET.DBERR, errmsg="保存短信验证码异常")
pipeline操作Redis数据库
Redis的 C - S 架构:
基于客户端-服务端模型以及请求/响应协议的TCP服务。
客户端向服务端发送一个查询请求,并监听Socket返回。
通常是以阻塞模式,等待服务端响应。
服务端处理命令,并将结果返回给客户端。
存在的问题:
如果Redis服务端需要同时处理多个请求,加上网络延迟,那么服务端利用率不高,效率降低。
解决的办法:
管道pipeline
pipeline的介绍
管道pipeline
可以一次性发送多条命令并在执行完后一次性将结果返回。
pipeline通过减少客户端与Redis的通信次数来实现降低往返延时时间。
实现的原理
实现的原理是队列。
Client可以将三个命令放到一个tcp报文一起发送。
Server则可以将三条命令的处理结果放到一个tcp报文返回。
队列是先进先出,这样就保证数据的顺序性。
pipeline操作Redis数据库
实现步骤
1. 创建Redis管道
2. 将Redis请求添加到队列
3. 执行请求
代码实现
1 # 创建Redis管道
2 pl = redis_conn.pipeline()
3 # 将Redis请求添加到队列
4 pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
5 pl.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
6 # 执行请求
7 pl.execute()
图形验证码接口设计和定义
图片验证码
图形验证码逻辑分析
图形验证码接口定义
图形验证码蓝图
1 @api.route('/image_codes/<image_code_id>')
2 def get_image_code(image_code_id):
3 """
4 获取图片验证码
5 :param image_code_id: 图片验证码编号
6 :return: 返回验证码图片
7 """
JQ实现图形验证码展示
1 function generateImageCode() {
2 // 形成图片验证码的后端地址, 设置到页面中,让浏览请求验证码图片
3 // 1. 生成图片验证码编号
4 imageCodeId = generateUUID();
5 // 是指图片url
6 var url = "/api/v1.0/image_codes/" + imageCodeId;
7 $(".image-code img").attr("src", url);
8 }
2020-11-23