【设计】短信验证码业务中的组件化设计

前言

背景:目前在做一个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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值