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

2023-05-16

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对外 API 接口,请把握这3 条原则,16 个小点 的相关文章

  • RESt api:根据身份验证对资源和内容进行识别

    我正在设计一个遵循 HATEOAS REST 原则的 API 但我不确定这个基本点 资源识别 假设这个网址 images它公开了用户 向该用户 上传的所有图像 假设我使用 oauth 访问令牌进行身份验证 images 的内容将根据授权标头
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 你可以拥有你的 API 并在 Laravel 中使用它吗?

    我制作了一个在 Laravel 中返 回 json 的 API 路线 api php 现在我想在我的内部使用所述APIweb项目的一侧 路线 web php 包括中间件 刀片视图 etc 我当前的解决方案是这样的 public functi
  • Flask Restful API url

    我正在使用 Flask RESTful http flask restful readthedocs org en latest index html http flask restful readthedocs org en latest
  • Elasticsearch GET API 获取分片大小

    在 Elasticsearch 2 3 3 中 有没有办法使用返回 JSON 的 GET API 获取分片大小 目前我找到了以下几种获取shard size的方法 这两种方法都存在问题 recovery gt 使用 JSON 进行响应并提供
  • 我们如何查询Kibana?

    我们如何使用 REST API 请求 Kibana 来获取可视化请求 和回应 Like this 我想使用 NodeJS 来操作 Kibana 的结果 目的是我想以编程方式 通过 REST API 直接查询 Kibana 以获取 ES 请求
  • 为我的网站构建 API 哪个更好:MVC 或 Ado.net 数据服务?

    我有一个用MVC构建的网站 现在我想为这个网站构建一个API 让用户使用这个API来实现不同的网站 Web服务 插件和浏览器扩展 我经历过这个article http weblogs asp net cibrax archive 2010
  • 如何在 .NET 应用程序中使用 W3C 标记验证器 API?

    我发现有一个W3C 标记验证器的 API http validator w3 org docs api html 我之前曾问过 是否有适用于 W3C 标记验证器 API 的 NET 库 https stackoverflow com que
  • Google BigQuery 与 PHP 集成

    我需要帮助将 google bigquery 代码集成到 PHP 中 所以我可以从 php 代码本身执行查询和其他类型的操作 需要您的帮助并建议我一些工作示例链接 提前致谢 这是一段代码 正确地创建一个Google Client using
  • 使用magento中SOAP API的salesOrderInfo获取简单的产品sku和数量

    我在以下代码中添加了 app code core Mage Sales Model Order Api php File public function info orderIncrementId order Mage getModel s
  • 如何用java制作字典? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试用java制作一个离线词典
  • RabbitMQ HTTP API 请求 401 未经授权

    我正在尝试访问 RabbitMQ Rest 但收到 401 未经授权的错误 我想访问队列信息并获取消息编号 我发现这是一个解决方案 DefaultHttpClient httpClient new DefaultHttpClient Htt
  • 通过 C# 访问 Google 拼写/建议 API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我正在开发的应用程序中使用 Google 的拼写纠正 建议 我用 google 搜索过 但发现的只是 Google 取消的 SO
  • 访问应用程序,带有表单任务栏图标的隐藏应用程序窗口

    我有一个带有一个主表单的访问应用程序 当您打开应用程序时 AutoExec 宏会通过 Windows API apiShowWindow 隐藏应用程序 然后 AutoExec 打开设置为 Popup 的主窗体 这一切都很顺利 我的数据库内容
  • 限制 Rails 应用程序生成的出站 API 调用

    我不是专业的网络开发人员 但我喜欢把浏览网站作为一种爱好 最近 我一直在开发一个 Rails 应用程序作为一个项目来帮助我学习框架 我的玩具应用程序的目标是通过其他服务的 API 获取数据 并让我可以使用搜索功能进行查询 但是 我想要从中提
  • 根据路由动态加载 Node.js 模块

    我正在使用 Express 在 Node js 中做一个项目 这是我的目录结构 root start js server js lib api user getDetails js user register js The lib api
  • IB Java API:提取多个合约的股票数据(实时柱)

    我正在对算法交易和 IB API 进行一些自学和实验 我决定使用 Java 但我愿意切换到 C 我浏览了一个在线教程 该教程将引导您完成下面所示的代码 但我想知道是否可以将其扩展到一只股票之外 我想浏览所有 SP500 股票并检查股票数据
  • 字典 API(词汇)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个好的 NET 字典 API 吗 我对含义不感兴趣 而是我需要能够以多种不同的方式查询单词 返
  • Facebook 通过 API“Boost Post”?

    我一直在浏览文档 发现可以通过 Facebook 广告 API 实现 Boost Post 功能 但是 我在查找 Boost Post 到底有什么作用时遇到了一些困难 即 API 的哪一部分对应 Facebook UI 的 Boost Po
  • Canvas.drawVertices(...) 不绘制任何内容

    下一类是红色三角形的视图 public class FreeStyleViewII extends View private final Paint paint new Paint private final int colors new

随机推荐

  • 关于STM32 CAN 滤波器设置的记录

    滤波模式有以下两种 xff1a 屏蔽位模式 标识符列表模式 过滤器的位宽 xff1a 16位过滤器 32位过滤器 下面记录一下我做过测试的代码 代码说明 xff1a 这是CAN2的滤波器 xff0c stm32f107的两组CAN滤波器是共
  • 定时器判断串口接收结束

    void USART1 IRQHandler void 串口1中断服务程序 u8 Res if USART GetITStatus USART1 USART IT RXNE 61 RESET 接收中断 Res 61 USART Receiv
  • gcc编译时对'xxxx'未定义的引用问题

    这个主要的原因是gcc编译的时候 xff0c 各个文件依赖顺序的问题 在gcc编译的时候 xff0c 如果文件a依赖于文件b xff0c 那么编译的时候必须把a放前面 xff0c b放后面 例如 在main c中使用了temp xff0c
  • 【编译人生】跨平台程序设计BOOST库以及编译方案的选择

    boost库很方便 xff0c 不用说 xff0c 下面是编译方法 xff0c 以WINDOWS平台为例 1 在 boost解压缩文件路径下 xff08 可能不同版本的路径位置build有所不同 xff09 cd d tools build
  • CAN总线的标准帧和扩展帧

    CAN总线的标准帧和扩展帧主要决定帧ID的长度 xff0c 标准帧的帧ID长度是11位 xff0c 帧ID的范围是000 7FF 扩展帧的帧ID长度是29位 xff0c 帧ID的范围是0000 0000 1FFF FFFF CANopen帧
  • CAN扩展帧详解

    寻址方式
  • linux 发送get/post请求

    目录 get post 43 json get curl location request GET 39 http xxxx param1 61 2027xxxx 39 url参数中涉及特殊字符的参数部分 需要转义 例如 curl 34 h
  • ROS -PCL程序包建立和CMakelist.txt修改

    一 创建工作空间 wtj 64 wtj echo ROS PACKAGE PATH wtj 64 wtj mkdir p dev catkin ws src wtj 64 wtj cd dev catkin ws src wtj 64 wt
  • jetson nano 供电模式的切换或自定义供电模式

    前言 xff1a jetson nano 开发板在预设的10W MAXN 模式下需要用5v4A的DC供电 用5v2A的DC或者micro usb供电建议使用5W模式 供电不足会导致掉电关机 以下是学习jetson nano时 xff0c 对
  • 自动驾驶之——CAN总线简介

    自动驾驶技术之 无人驾驶中的CAN总线 CAN 是Controller AreaNetwork 的缩写 xff0c 中文名为控制器局域网络 xff0c 是ISO国际标准化的串行通信协议 xff0c 是一种用于实时应用的串行通讯协议总线 xf
  • CMake中find_package()查找指定版本的库,以Qt库多版本共存为例

    Qt安装了多个版本时 xff0c CMake中写的find package 到底找到的是哪个库 xff1f 例如 xff0c 我电脑安装了两个版本的Qt xff0c 一个是5 12 3另一个是5 14 2 此时我的CMake如何指定使用哪个
  • 游戏中常用的寻路算法(6):地图表示

    在本系列文档大部分内容中 xff0c 我都假设A 用于某种网格上 xff0c 其中的 节点 是一个个网格的位置 xff0c 边 是从某个网格位置出发的各个方向 然而 xff0c A 可用于任意图形 xff0c 不仅仅是网格 xff0c 有很
  • Redis 官方可视化工具

    RedisInsight 是一个直观高效的 Redis GUI 管理工具 xff0c 它可以对 Redis 的内存 连接数 命中率以及正常运行时间进行监控 xff0c 并且可以在界面上使用 CLI 和连接的 Redis 进行交互 xff08
  • 一个注解搞定接口返回数据脱敏

    下午惬意时光 xff0c 突然产品小姐姐走到我面前 xff0c 打断我短暂的摸鱼time xff0c 企图与我进行深入交流 xff0c 还好我早有防备没有闪 xff0c 打开瑞star的点单页面 xff0c 暗示没有一杯coffee解决不了
  • 系统架构性能问题诊断及优化思路

    01 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题 xff0c 而在上线后出现了比较严重的性能问题 xff0c 那么实际上潜在的场景主要来自于以下几个方面 业务出现大并发的访问 xff0c 导致出现性能瓶颈 上线
  • 在Redis分布式锁上,栽的8个跟头

    在分布式系统中 xff0c 由于 redis 分布式锁相对于更简单和高效 xff0c 成为了分布式锁的首先 xff0c 被我们用到了很多实际业务场景当中 但不是说用了 redis 分布式锁 xff0c 就可以高枕无忧了 xff0c 如果没有
  • 牢记16个有用的 SpringBoot 扩展接口

    1 背景 Spring的核心思想就是容器 xff0c 当容器refresh的时候 xff0c 外部看上去风平浪静 xff0c 其实内部则是一片惊涛骇浪 xff0c 汪洋一片 Springboot更是封装了Spring xff0c 遵循约定大
  • ZYNQ研究----(3)7100 裸跑LWIP协议栈

    硬件环境 xff1a 创龙TLZ7XH EVM开发板 软件环境 xff1a VIVADO 2017 4 1 调用ZYNQ核 查开发板原理图 xff0c MIO16 27为以太网接口52 53为MDIO接口 xff0c 配置如下 使能串口1
  • SQL优化 20 连击

    一 查询SQL尽量不要使用select xff0c 而是具体字段 1 反例 SELECT FROM user 2 正例 SELECT id username tel FROM user 3 理由 节省资源 减少网络开销 可能用到覆盖索引 x
  • 对外 API 接口,请把握这3 条原则,16 个小点

    对外API接口设计 安全性 1 创建appid appkey和appsecret 2 Token xff1a 令牌 xff08 过期失效 xff09 3 Post请求 4 客户端IP白名单 xff08 可选 xff09 5 单个接口针对IP