飞雪连天射白鹿,笑书神侠倚碧鸳

0%

API接口设计攻略

前端业务需要怎么样的接口,如何保证交互安全

本篇不是RESTful风格的描述,提供思路仅供参考


https

防抓包不用多说

格式规范JSON

对一个项目来说,统一格式的返回数据,前后端可以进行优雅抽象,简洁处理业务代码
对一个团队来说,统一格式,可以封装通用类,作为沉淀

1
2
3
4
5
{
code:Number,
data:Array | Object,
msg:String
}

token

访问令牌字符串,用于标识客户端的身份

服务端返回appid和key,(这里的客户端是指接口的请求方,服务端是指接口的处理方),这个key需要保存到客户端,并作安全处理

举例抖音的signature,我还没找到是如何生成的(知道的小伙伴可以下方留言告诉我)

token作为key,关联信息作为value,缓存到redis中,当请求处理时检查token存在及过期时间,否则返回异常

API token 接口令牌

访问不需要登录的数据,比如登录注册,基本数据获取

通过appid、timestamp、sign来换token

USER toekn 用户令牌

访问登录后的数据,用户信息,增删改

通过用户名、密码来换token

时效性

  • 一次性
    • 调用后销毁
  • 过期时间
    • 20分钟~2小时
  • 过期后激活并续期
    • 用旧token请求,返回新token,延长过期时间,下次用新token

timestamp

接口调用时的客户端时间戳,缩短Dos攻击时间

服务端判断时间差或者解析sign在几分钟内通过,以外的拦截过滤掉

Dos是指利用网络协议层的缺陷,大量请求服务器资源、占用带宽、填充硬盘空间,导致服务器无法正常工作,直至停止响应崩溃

  • 简述Dos方式
    • Pingflood Ping包,堵塞网络&主机资源
    • Synflood SYN包,收到主机ACK不回应,建立维护大量连接队列,消耗主机资源
    • Smurf ICMP包,伪装客户端为目标主机地址,向子网广播地址发包,使子网主机回应目标主机,形成攻击
    • Land-based 设置包的源地址和目标地址为主机地址,通过ip欺骗方式发给目标主机,造成与自身建立连接的死循环
    • Ping of Death 包长度分割片段,总和大于65536字节上限,造成宕机
    • Teardrop 包分割小片段,使合并前分配大量资源堆栈

sign

参数签名,防止篡改

ascii码升序+token+key+timestamp+随机数,加密

可以放在请求体中,也可以放在header中,即使参数被修改,通过sign解析在接收时验证

(有人说sign是骗自己,没有增加防护效果,这里再提一次,抖音的signature是怎么加密的呢)

重复提交

前端做请求触发的拦截
后端设置超时时间
- 第一次提交时sign保存、超时时间
- 第二次请求时检测是否存在sign
- 存在为重复提交,因为如果sign过期token也会过期

增加装饰器自定义接口防重功能

使用

前端

  • 客户端申请appid和key
  • 客户端携带appid、timestamp、sign获取服务端api token
    • 客户端请求普通接口
  • 客户端登录,用户名密码换取user token
    • 客户端请求权限接口

后端

Thread多线程,单个线程中,方法共享内存,能从上下文取值

  • api接收参数时,拦截器校验token合法
  • 找到token对应的用户信息,存储到Thread中,这样在生命周期中都能获取到

文档工具

Swagger / Yapi / Postman / Online&Offline Website / Excel / PPT / Word

听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本