点击关注公众号,实用技术文章及时了解

来源:blog.csdn.net/weixin_42304845/article/

details/109305740

对外API接口设计

  • 安全性

    • 1、创建appid,appkey和appsecret

    • 2、Token:令牌(过期失效)

    • 3、Post请求

    • 4、客户端IP白名单 (可选)

    • 5、单个接口针对IP限流(令牌桶限流,漏桶限流,计数器限流)

    • 6、记录接口请求日志

    • 7、采用Https

    • 8、数据合法性校验

    • 9、密码查询(加缓存,key使用客户号)

    • 10、接口调用失败告警

    • 11、高可用:服务器集群部署(2-3)

    • 12、变更轨迹,保存上次密码?

    • 13、查询密码和交易密码是否分两条?

  • 幂等性

  • 数据规范

    • 版本控制

    • 响应状态码规范

    • 统一响应数据格式


安全性

1、创建appid,appkey和appsecret

  • appid:应用的唯一标识

  • appkey:公钥=账号

  • appsecret:私钥=密码

1、设计一个认证系统,专用于创建第三方接入应用的账号信息,用于生成appid,appkey和appsecret,然后发appkey和appsecret给第三方接入应用,用于做认证

ps:appkey和appsecret成对出现的机制,目的在于首次验证(类似登录场景),用来申请一个token,之后请求数据请求,就直接带token请求服务端认证即可。

2、第三方接入应用自行注册,需要校验企业信息合法性(暂不考虑)

2、Token:令牌(过期失效)

1、第三方接入应用获取第一步中的appkey和appsecret

2、请求认证系统获取nonce随机数,服务端在缓存中存放下nonce

3、客户端拿到这个随机数后将其与appsecret拼接生appsecretStr,然后调用生成签名方法,传入appsecretStr,appkey,nonce,url(备注:可转大写,转小写,追加特殊字符,然后加密)进行非可逆加密(MD5/SHA1等),生成签名A。接着构造请求把签名放到请求头signature,post请求体中放入参数:appkey,nonce,timestamp,url根据request.getRequestURI()获取,调用认证接口

4、认证系统获取请求后,查询根据appkey查询缓存中的nonce,判断是否存在,不存在则提示不合法请求;判断是否相等,不等则为恶意请求。

判断timestamp的时效性,防止恶意请求:数据包中的客户端时间戳字段,然后用服务器当前时间去减客户端时间,看结果是否在一个区间内。

先根据appkey查询数据库,判断是否存在,如不存在则提示不合法用户;反之,查出appsecret,按照客户端的签名加密方式,进行加密,生成签名B,比较A和B,如果一样则生成token,失效缓存中的nonce,返回token。

3、Post请求

4、客户端IP白名单 (可选)

5、单个接口针对IP限流(令牌桶限流,漏桶限流,计数器限流)

限流是为了更好的维护系统稳定性。使用redis进行接口调用次数统计,ip+接口地址作为key,访问次数作为value,每次请求value+1,设置过期时长来限制接口的调用频率

6、记录接口请求日志

使用aop全局记录请求日志,快速定位异常请求位置,排查问题原因。

7、采用Https

1、服务端配置SSL证书

2、客户端调用https工具类忽略服务端证书校验

8、数据合法性校验

9、密码查询(加缓存,key使用客户号)

1、密码更新时,更新redis;

2、缓存查不到,查数据库,同时更新缓存;

3、密码在缓存和数据库都需要加密,返回时才解密(或者是返回客户端时,客户端自行解密)

10、接口调用失败告警

11、高可用:服务器集群部署(2-3)

客户端重试机制

12、变更轨迹,保存上次密码?

13、查询密码和交易密码是否分两条?

幂等性

幂等性是指任意多次请求的执行结果和一次请求的执行结果所产生的影响相同。说的直白一点就是查询操作无论查询多少次都不会影响数据本身,因此查询操作本身就是幂等的。但是新增操作,每执行一次数据库就会发生变化,所以它是非幂等的。

幂等问题的解决有很多思路,这里讲一种比较严谨的。提供一个生成随机数的接口,随机数全局唯一。调用接口的时候带入随机数。

第一次调用,业务处理成功后,将随机数作为key,操作结果作为value,存入redis,同时设置过期时长。

第二次调用,查询redis,如果key存在,则证明是重复提交,直接返回错误。

数据规范

版本控制

一套成熟的API文档,一旦发布是不允许随意修改接口的。这时候如果想新增或者修改接口,就需要加入版本控制,版本号可以是整数类型,也可以是浮点数类型。一般接口地址都会带上版本号,http://ip:port//v1/list

响应状态码规范

统一响应数据格式

为了方便给客户端响应,响应数据会包含三个属性,状态码(code)、信息描述(message)、响应数据(data)。客户端根据状态码及信息描述可快速知道接口,如果状态码返回成功,再开始处理数据。

响应结果定义及常用方法:

推荐

主流Java进阶技术(学习资料分享)

Java面试题宝典

加入Spring技术开发社区

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

3条原则,16个小点,帮你写出一个优秀的对外接口!相关推荐

  1. C++小游戏扫雷——如何写出一个简易的扫雷

    C++小游戏扫雷--如何写出一个简易的扫雷 其实很简单,但是这段代码不知道是否有BUG,有的话可以提出,谢谢大家. all.h函数库 #include "all.h" using ...

  2. 这45个小技巧,帮你写出一手同事都羡慕的漂亮代码!

    这45个小技巧,帮你写出一手同事都羡慕的漂亮代码! 不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的if else ,根本无法阅读,更不知道代码背后的含义,最重要的是 ...

  3. 为什么你的文案不卖货?5大秘籍帮你写出专业文案

    为什么你的文案不卖货?5大秘籍帮你写出专业文案 为什么你写不好文案?为什么你写出的文案不卖货?昨晚,有"文案帝"之称的首席内容官进化实验员游离冰,给我们分享了他的8年文案经验和写作 ...

  4. python小项目实例流程-Python小项目:快速开发出一个简单的学生管理系统

    原标题:Python小项目:快速开发出一个简单的学生管理系统 本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: ...

  5. python小项目案例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  6. python项目开发实例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  7. python优雅代码大全_10个Python技巧帮你写出更优雅的代码

    阅读本文需要 2 分钟,公众号 somenzz ,欢迎学习 Python 的朋友订阅. 现在写代码的门槛非常低了,少儿都开始编程了,但从代码的风格一眼看出编码水平.是的,写代码是容易的,写出易读的代码 ...

  8. 1032: 单位转换(1级)假设Laughing Sir希望全部采用公里计量,你可以帮他写出转换程序吗?已知1英里等于1.609公里。

    1032: 单位转换(1级) 时间限制: 1 Sec 内存限制: 128 MB 提交: 309 解决: 215 [提交] [状态] [讨论版] [命题人:admin] 题目描述 Laughing Si ...

  9. 学会提问,ChatGPT可以帮你写出高质量论文

    前言 ChatGPT 很火,火到大家以为他可以上天入地,上到天文,下到地理无所不能,但实际使用大家是不是会遇到如下的情况. 写论文步骤 今天,我们来探讨下怎样问ChatGPT,才能帮你写出一篇优秀的论 ...

最新文章

  1. Spring+Hibernate整合
  2. 云端迁移需谨遵四大关键步骤
  3. c 普通的文本变成注释文本的快捷键_收藏了!IntelliJ IDEA 2019 快捷键开发手册
  4. 开学考试学生成绩管理Java
  5. 【mark】linux 终端命令行下的快捷键(自己已验证所有)
  6. python高斯求和_二、算法分析
  7. 论文浅尝 | 引入“引用”的语言模型
  8. linux运算_linux中的计算【转】
  9. matlab 变调器,关于变声变调的matlab设计 比较详细
  10. Hive大数据-Hive的架构---大数据之Hive工作笔记0003
  11. php怎么遍历json字符串数组,php-使用jquery遍历json数组
  12. ASP网页中 制作连续无缝滚动文字
  13. 推荐2款在线Ascii画图工具
  14. ai疾病风险因素识别_克服AI的“蠕动因素”
  15. flex 连接mysql数据库_Flex+blazeds实现与mySQL数据库的连接(已成功实现此文的例子)...
  16. win10u盘被写保护怎么解除_Win10系统下U盘写保护应该如何破除!
  17. Php中什么时候用单引号,PHP中单引号和双引号的用法举例
  18. IEEE802模型与协议标准
  19. 人工神经网络的硬件实现,人工神经网络基本概念
  20. 关于电脑任务栏软件图标变成白色白纸的解决办法

热门文章

  1. “摔杯一怒为俞渝” 当当创始人李国庆:蓄谋已久的阴谋 不吐不快
  2. 女子15000元网购兰基博尼跑车,上路就被查了,这操作真没见过!
  3. 科创板第二天:全线翻绿 仅4股飘红
  4. 华为鲁勇:华为5G专利数量全球第一 比美国所有企业还多
  5. 程序员打字练习_程序员必须来看的面试圣经!!
  6. opencv 矫正图片
  7. linux 彻底定制指南,8.3. Linux-2.6.11.12 《Linux 彻底定制指南》[翻译:金步国]...
  8. MFC小笔记:控件随窗口变化
  9. 如何监测mysql主从复制状态_如何实时检测mysql主从状态,并做邮件告警?
  10. 【clickhouse】clickhouse Exception: Table is in readonly mode