前言
背景:目前在做一个C端项目,需要加短信验证功能。
问题:只有发短信的api。生成二维码 + 验证二维码的代码,需要手写。(公司不想花钱)
目标:优先满足业务诉求(替换掉如下的api),使用组件化的设计为后续业务提供重用的可能

时序图
- 将设计拆成两个时序,一个是生成二维码,一个是发送二维码
- 需要考虑风控的影响,避免接口被恶意刷浪费钱
- 将组件做出无状态的,方便业务层无感调用
生成验证码

校验验证码

组件抽象

风控组件
提供接口的限流能力,避免接口被恶意刷,造成资损。可以用在发短信前。
验证码组件
负责验证码生成,验证码与认证载体的绑定(如手机号 - 验证码),验证的码校验
数据存储层
风控组件和验证码组件都需要用到,时序图简单用redis实现,实际上可以选其他物理存储。
后记
后续
接口保护除了有验证码,细究还是不安全的,讲其中的两点:
- 存在ip欺骗的技术,限流防不住
- 可以使用浏览器指纹技术加一层验证,但是依旧有指纹欺骗的技术
短信验证码不能解决所有恶意请求,只能用提升攻击成本来降低被攻击的概率。
附录
plantuml相关脚本
- 生成验证码
@startuml
actor C端用户 as user
participant 留资页面 as activity
participant 业务逻辑 as biz
participant 验证码组件 as code
participant 风控组件 as risk
database Redis as redis
participant 短信服务 as sms
' 生成、发送验证码
user -> activity: 准备留资
activity -> activity: 填写表单
activity -> biz: 请求后端
biz -> biz: **业务逻辑校验**
' 调风控组件
biz -> risk: 调风控组件
risk -> risk: 执行风控规则
risk -> redis: 存储风控结果
redis --> risk:
risk -> biz: 风控结果
' 调验证码组件
biz -> code: 获取验证码
code -> code: 生成验证码
code -> redis: 存储手机号-验证码映射
redis --> code:
code -> biz: 验证码
biz -> sms: 发送用户验证码
sms -> sms: 运营商处理短信请求
sms -> user: 短信验证码
@enduml
- 校验验证码
@startuml
actor C端用户 as user
participant 留资页面 as activity
participant 业务逻辑 as biz
participant 验证码组件 as code
participant 风控组件 as risk
database Redis as redis
user -> activity: 确认留资
activity -> activity: 获取验证码按钮disable \n 表单提交按钮 enable
activity -> biz: 请求后端
' 调风控组件
biz -> risk: 调风控组件
risk -> risk: 执行风控规则
risk -> redis: 存储风控结果
redis --> risk:
risk -> biz: 风控结果
' 调验证码组件
biz -> code: 入参手机号、验证码
code -> redis: 查手机号对应的验证码
redis --> code: 验证码
code -> code: 校验验证码
code -> biz: 验证结果
' 业务逻辑
biz -> biz: 业务逻辑校验
biz -> biz: 业务逻辑执行
biz -> user: 留资成功
@enduml

1083

被折叠的 条评论
为什么被折叠?



