对外 API 接口,请把握这3 条原则,16 个小点

news2025/1/12 20:48:41

对外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)。客户端根据状态码及信息描述可快速知道接口,如果状态码返回成功,再开始处理数据。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git如何回滚,返回到之前的记录

文章目录1.建立一个reset的测试文件,并连续提交。2.进行回滚测试。2.1测试,回滚到第二次提交2.1.1首先使用git log命令查看commit记录2.1.2查看结果.2.1.3回滚结果提交到远程2.2.你发现自己回滚的多了3.1撤销测试3.1建立文件,多次填写内容上传到git3.2撤…

顺序栈和链栈的定义和使用C语言实现(附有完整代码)

栈的基本内容: 无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,但是它们本质也是线性表,只是在基本操作上没有表那么“自由”。比如:栈只能从栈顶进行插入和删除&a…

【Linux】Linux文件权限的理解

💬推荐一款模拟面试、刷题神器 、从基础到大厂面试题:👉点击跳转刷题网站进行注册学习 目录 一、Shell是什么? 1、Shell承担用户和内核间的翻译工作 2、拒绝用户非法请求,保护内核 3、派生子进程执行用户指令 二…

SpringCloud

SpringCloud 三 本章知识点 3.1 项目架构演变 3.1.1 单体应用架构 部署到一个war里 部署到一个web容器里(如tomcat) 公用一个DB 优点: 容易测试 容易部署缺点: 开发效率低 代码维护难 部署不灵活(如构建时间特别长&#xff0…

人工智能轨道交通行业周刊-第19期(2022.10.17-10.23)

本期关键词:首都智慧地铁、AI四小龙、文本生成视频、低光照目标检测、天窗、电务人员 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…

四非到保研厦大,我们还有多少路要走----技术人的保研之路

前言: “Hello,大家好我叫是Dream呀!”在1024程序员节到来之际,我想和大家一起分享一下技术人生的故事----我的学长2022年从四非保研至厦大的经验和经历,希望大家可以耐心看完,收获技术力量,更加…

Java面试题

1、JDK 、JRE和JVM 的区别? JDK,java development kit java开发工具包,为java程序提供开发和运行环境JRE, java runtime environment java运行环境,为java程序提供必须的运行环境JVM, java virtual mach…

RayVentory以改进IT的分析,RayVentory原始数据之间轻松切换

使用KeyCloak进行SSO(单点登录)-使用单点登录解决方案,并直接与KeyClok交互。 特定于公司的数据丰富—使用产品所有者、价格或许可证信息等信息轻松丰富您的数据,以获得所需数据的综合视图。 用于更深入数据管理的新连接器-添加了许多新连接器&#xff0…

Vue3中 响应式 API ( readonly、shallowReadonly、toRaw、markRaw ) 详解

传送门:Vue3中 响应式 API ( reactive、ref、toRef、toRefs ) 详解 传送门:Vue3中 响应式 API( shallowReactive、shallowRef、triggerRef 、customRef )详解 1. readonly 函数 接受一个对象 (不论是响应式还是普通的) 或是一个…

深度学习visio作图技巧

目录 1.不显示跨线 2.调节连接线拐弯 3.方框与连接线反应 4.设计一个卷积块/特征图 5.设计一个特征图方块 1.不显示跨线 不显示跨线:设计→连接线,取消显示 跨线的勾选 2.调节连接线拐弯 连接线拐弯:按住shift拖动线条即可控制连接线拐…

高数(下) 第十二章:无穷级数

文章目录Ch12. 无穷级数(一) 常数项级数正项级数交错级数任意项级数4个特殊的常数项级数收敛级数的性质(针对任意项级数)常数项级数的审敛法1.正项级数审敛法(判别法)(1)比较判别法(2)比较审敛法极限形式(3)比值法(4)根值法(5)收敛的充要条件(6)绝对收敛…

Spring Boot 篇四: Spring Data JPA使用SQL Server

本文目录SQL Server Express的安装或直接DockerSQL Server JDBC DriverTCP/IP 链接端口Integrated SecuritySSL总结本篇介绍篇一至篇三中用到的JPA链接SQL Server的具体情况以及实战过程中可能遇到的问题。 SQL Server Express的安装或直接Docker 具体的下载和安装教程&#…

sanic:通过dockerfile部署

简介:长期以来,环境一直是部署的难题。如果您的项目中有冲突的配置,您将不得不花费大量时间来解决它们。幸运的是,虚拟化为我们提供了一个很好的解决思路。Docker 就是其中之一。 历史攻略: sanic框架:简…

内网渗透体系学习1

工作组 工作组(Work Group)是计算机网络的一个概念,也是最常见和最普通的资源管理 模式,就是将不同的计算机按照功能或部门分别置于不同的组。通过创建不同的 工作组,不同的计算机可以按照功能或部门归属到不同的组内,整个组织的网…

XSCTF联合招新赛-热身赛(部分WP)

由于没有多少时间答题,抽空在划水的时候做了一两道题目.比赛已经结束了24小时了。特把写的WP分享一下,欢迎各位大佬进行指点。 文章目录warm_up头头是道B45364EZphpeasy_sqlbaigeiRSAimage1image2image3image42^11warm_up 只有虔诚的嘉心糖才能成功拿到flag 地址:4…

5G核心网技术基础自学系列 | 语音业务

书籍来源:《5G核心网 赋能数字化时代》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 3.9.1 5G语音概述 除了用于机器之…

libusb系列-003-Linux下libusb源码编译

libusb系列-003-Linux下libusb源码编译 文章目录libusb系列-003-Linux下libusb源码编译摘要源码下载及解压下载源码解压下载的源码压缩包打开终端准备编译环境安装make dh-autoreconf安装 libudev-dev编译错误的教程增加执行bootstrap.sh指令再编译make安装库确认下关键字&…

C语言中的文件操作那些事儿~~

是时候该学着操作文件了什么是文件文件种类文件名为什么要使用文件文件的打开和关闭文件的顺序读写fgetc/fputcfgets/gputsfscanf/fprintffread/fwrite文件的随机读写fseekftellrewind文件读取结束的判断文件缓冲区男人过了二十岁就要学着沉稳,遇到问题不要慌&#…

【Java】异常

看似不起波澜的日复一日 会突然在某一天让人看到坚持的意义 目录 1.认识异常 1.1 异常的概念 1.2 常见的异常 2.异常的体系结构 3.异常的分类 3.1 编译时异常 3.2 运行时异常 4.异常的处理 4.1 事前防御型 4.2 事后认错型 5.事后认错型处理 5.1 异常的抛出…

第22章 软件安装 RPM/ YUM

上章节是用源代码来编译完成; 发商编译好之后直接把可执行文件发布给用户来安装也是一种方法,类似于windows下的安装; 客户端取得这个文件后,只要通过特定的指令来安装, 那么该软件文件就会依照内部的脚本来检测相依的…