API 接口管理 架构 api接口设计

提供给第三方的业务接口应该如何设计呢?需要从哪些方面考虑?以及如何实现这些方面?

1、标准化

  RESTful 

2、安全性

  1)请求token(防止接口被第三方调用)

    token作为调用系统的凭证。token可以设置一次有效(安全性最高,完全防止接口被第三方调用),不过推荐设置时效性,减少获取获取token接口的请求频率。 token建议放在请求头上,这样可以跟业务参数完全区分开。

    获取token一般会涉及的几个参数:appId、appKey、timestamp、nonce(requestId)、sign

    appIdappKey通过开发平台申请和下发,appId即应用Id,是请求方的全局唯一的标识,一个appId对应一个客户,appKey需要高度保密,用于接口加密时拼装appKey作为加密串,不作为网络传输。

    timestamp是时间戳,目的是为了减轻DOS攻击。防止请求被拦截后一直尝试请求接口。服务器设置时间戳阀值(5s),如果请求时间戳和服务器时间超过阀值,则响应失败。

    nonce(requestId)是随机值,目的是为了增加sign的多变性,也可以保护接口的幂等性,相邻的两次请求nonce不允许重复,如果重复则认为是重复提交,响应失败。(将每次请求的nonce参数存储到缓存中,每次请求去缓存中查询是否存在,如果存在则认为是非法请求)

    sign是参数签名,将appId,nonce,timestamp,还有其余非空请求参数,按照字母升序排列,然后使用URL键值对的格式(key1=value1&key2=value2)拼接起来,最后再拼接上appKey,组成待签名串;然后进行md5加密生成签名(或其他不可逆加密方式(如RSA2),有的情况要求先对待签名串进行UrlEncode,然后再加密生成签名)

    请求携带appId和sign,只有拥有合法的身份appId和正确的签名sign才放行。

  

  2)客户端IP白名单(防止接口被第三方调用)

    为了提高应用访问的安全性。开发者可以通过IP白名单功能设置能够合法访问服务端API的IP列表(获取API访问凭证相关接口除外),不在IP白名单列表中的来源IP的请求会被拒绝。

    输入的IP地址应为IPv4格式,不能为IP通配符,必须为公网服务器IP

  3)加密签名(加密防止隐私数据泄露,签名防止数据被篡改)

    对敏感入参进行AES加密,防止数据泄漏

    对所有请求参数拼装后进行RSA签名,防止参数遭篡改。请求进来之后先验证签名,签名不匹配直接返回失败

    (对于客户端与服务端的交互,AES密钥应使用动态密钥,每次由客户端生成AES密钥,并使用公钥进行加密传给服务端(RSA私钥保存在服务端))

  4)限流

    限流是为了更好的维护系统稳定性。防止接口遭恶意大量频繁调用(盗刷)。使用Redis进行接口调用次数统计,ip+接口地址作为key,访问次数作为value,每次请求value+1,设置过期时长来限制接口的调用频率。

    可使用阿里的Sentinel限流工具:https://github.com/alibaba/Sentinel

3、幂等性

  幂等性是指任意多次请求的执行结果和一次请求的执行结果所产生的影响相同。

  如查询删除是幂等的,新增修改是非幂等的。

  解决方案:

    服务方提供一个生成全局唯一随机数token的接口,客户端在调用业务接口前先向服务方发送请求获取token,在客户端获取token的时候,将token存入redis中。

      ① 服务方提供获取token的接口,token可以是uuid

      ② 客户端在调用业务接口前先调用接口获取token

      ③ 服务方在客户端获取token时,生成token,并将token 作为 key,客户端用户信息作为value,保存在redis中,然后返回token

      ④ 客户端请求业务接口时,将获取的token放在header(最好放在header中)或者作为请求参数请求接口

      ⑤ 服务端收到请求后,从headers中拿到token,然后根据token到redis中查找该key是否存在

      ⑥ 如果存在,业务处理成功后,从redis中删除此token。如果不存在,说明重复调用,返回请勿重复操作即可

      注意:从redis中查询token和删除token,要保证原子性,应使用redis分布式锁

  javascript:void(0)

4、规范标准

  1)加密、签名方式规范

    敏感字段采用AES加密,模式为CBC,具体算法为 AES/CBC/PKCS5Padding。

    签名的作用:对数据进行签名后,可以保证数据完整性,机密性和发送方角色的不可抵赖性,可以有效防止请求信息信息被篡改

    签名方式采用RSA2(签名算法为SHA256WithRSA,要求RSA密钥的长度至少为2048位),步骤如下:

      1)筛选并排序

        获取所有请求参数,不包括字节类型参数(如文件,字节流),剔除sign参数和值为空的参数,并且参数名和参数值前后不要带有空格,并按照参数名的第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;

      2)拼接

        将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串

      3)签名

        最后对待签名串签名,并进行BASE64编码。然后将生成的签名赋值给sign参数,拼接到请求参数中

  2)请求方式为POST

    除了sign参数外,其他参数全部以JSON格式放在body中。

    请求方需要对sign进行UrlEncode,且Content-Type:application/json; charset=utf-8

  3)接口返回规范

    返回类型为JSON格式,包含状态码code、描述msg、响应数据data,返回码和描述提前定义好。必要的话,对响应的参数进行签名赋值给sign参数一并返回。

  4)统一参数校验和验签,打印请求日志

    使用AOP全局记录请求日志(请求接口URL,请求参数),响应日志。设置请求线程号,用于快速定位异常请求位置,排查问题原因

    使用另一个AOP统一进行参数非空校验、签名校验、token校验,不通过直接返回失败,不进入业务代码。

5、接口设计示例

  如何调用API

  1、请求参数

    请求头:这部分参数需要放在 HTTP 请求的 Header 中,主要包含调用 API 所需要使用的访问凭证(access token)以及 HTTP Content-Type(除获取凭证外其余接口:Content-Type:application/json; charset=utf-8)

    请求体:POST请求的请求参数以JSON格式放在请求body中

    查询参数:这部分参数需要在URL后后使用?进行连接,多个查询参数间以&分隔

      注意:POST请求的sign参数放在请求URL中。如:https://api_host/api_path?sign=xxx'

  2、API调用流程

    

    ①、申请 partnerId,partnerKey 

      partnerId:分配的合作方唯一的标识符

      partnerKey:需要合作方高度保密,用于接口加密时拼装partnerKey作为加密串

    ②、获取API调用所需要的凭证

      补充:凭证即接口准入性校验,已知接口准入性校验方式有:

access_token
ip白名单
签名机制
    ③、将凭证放在请求头,调用API接口

  3、API调用方式

  调用API接口时,需要使用 HTTPS 协议、JSON 数据格式、UTF8 编码。请求需要把访问凭证 access token 放到 Header 的 Authorization 中。

$ curl -X POST 'https://api_host/api_path?sign=xxx'
-H 'Authorization:<这里替换为对应的access token>'
-H 'content-type:application/json; charset=utf-8'
-d '{
        "field": "value"
}'

  4、API响应结果

  API 的响应体结构包括 code、msg、data 三个部分

  code为返回码,msg为返回信息,data为 API 的调用结果。默认请求成功时,code 为 0000,msg 为 success。data 在一些操作类 API 的返回中可能不存在,如:

{
  "code": 0,
  "msg": "success",
  "data": {
    // 响应的具体数据内容
  }
}


5、返回码说明

获取访问凭证接口

    ①、概述:要访问API,需要先获取相应的访问凭证(access_token),作为API调用时的鉴权,在调用内容推送API时,被调用方可据此识别调用方的身份

    ②、说明:access_token具有一定的时效性,默认最长有效期为3600秒,在需要的情况下,合作方需要调用此接口来获取一个新的access_token

    ③、请求URL/Method

④:请求参数 

⑤:响应参数

   

 示例:

{
  "code": 0,
  "msg": "success",
  "data": {
    "access_token":"c83a2e753d41494fbde7b4aa31f4fa66",
    "expires_in":"7200"
  }
}

总结:

    对于与外部的数据同步,如接入合作方的媒资数据

    需要同时有全量和增量两种方式:

    全量:看双方谈判,一方推全量或者一方拉全量即可

    增量:增量推

    对于数据接入方,最好的方式是拉全量、对方推增量的方式

      全量按天或周的频率拉取

      增量对方有更新及时推送过来,如果合作方不愿意,也可以我们主动去拉增量
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UML 总结(基于《标准建模语言UML教程》)

定义 UML 又称为统一建模语言或标准建模语言&#xff0c;是一种标准的图形化建模语言&#xff0c;它是面向对象分析与设计的一种标准表示。尽管UML 本身没有对过程有任何定义&#xff0c;但UML 对任何使用它的方法&#xff08;或过程&#xff09;提出的要求是&#xff1a;支持用…

Linux初阶——信号

一、预备 1、信号的处理方式 1.1. 默认动作 当收到一个信号时&#xff0c;就执行这个信号的默认动作。 1.2. 忽略 当收到一个信号时&#xff0c;就忽略执行这个信号的默认动作。 1.3. 自定义动作 当收到一个信号时&#xff0c;就执行信号的自定义动作。 2、硬件中断 你…

IT监控对接华三CAS云管平台监控方案

概述 CAS云管平台是新华三集团自主研发的虚拟化和云计算管理平台&#xff0c;它主要面向数据中心&#xff0c;提供虚拟化和云计算管理&#xff0c;在教育行业、网络安全领域、高性能计算业务、企业IT部门等领域被广泛应用。在信创国产化背景下&#xff0c;以CAS、Fusion等为代…

Ajax:表单 模板引擎

Ajax&#xff1a;表单 & 模板引擎 form 表单form 属性 Ajax操控表单事件监听阻止默认行为收集表单数据 模板引擎art-template{{}}语法原文输出条件输出循环输出过滤器 原理 form 表单 在HTML中&#xff0c;可以通过<form>创建一个表单&#xff0c;收集用户信息。而采…

基于centos7.9搭建在线购物网站

mall 搭建数据库配置Java配置jar包 一款模仿天猫的在线购物网站&#xff0c;基于centos7.9搭建 搭建数据库 官网下载软件包后上传 基于centos7.9搭建mysql5.6.42 [rootmysql02 ~]# ls anaconda-ks.cfg init.sh MySQL-5.6.42-1.el7.x86_64.rpm-bundle.tar解压 tar -xf My…

Python 自动化运维:Python基础知识

Python 自动化运维&#xff1a;Python基础知识 目录 &#x1f4ca; Python 基础复习 数据类型、控制结构与常用函数面向对象编程&#xff08;OOP&#xff09;与类的使用函数式编程概念与 lambda 表达式异常处理与日志记录的基本实践 1. &#x1f4ca; Python 基础复习 数据…

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接&#xff1a;Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写&#xff0c;发表于 2024 年 IEEE Symp…

word技巧:如何禁止复制word文件内容?

在文档管理与协作的复杂环境中&#xff0c;确保文档内容的完整性和安全性至关重要。Microsoft Word作为一款广泛使用的文字处理软件&#xff0c;提供了强大的限制编辑功能&#xff0c;允许用户控制对文档内容的修改权限&#xff0c;有效防止未经授权的更改。本文将深入解析Word…

LabVIEW如何学习数据结构和算法

作为LabVIEW程序员&#xff0c;在学习数据结构和算法时&#xff0c;由于LabVIEW以图形编程为主&#xff0c;与传统编程语言的学习方式有些不同。因此&#xff0c;理解算法思想并将其在LabVIEW中实现是关键。 ​ 1. 夯实编程基础概念 LabVIEW与文本编程语言在实现逻辑上的方式…

Maven项目报错:invalid LOC header (bad signature)

文章目录 Maven项目报错&#xff1a;invalid LOC header (bad signature)1. Maven项目加载或Pom.Xml刷新后仍出现如下错误2. 解决方法 Maven项目报错&#xff1a;invalid LOC header (bad signature) 1. Maven项目加载或Pom.Xml刷新后仍出现如下错误 错误提示&#xff1a; in…

方形件排样优化与订单组批问题探析

方形件排样优化与订单组批问题是计算复杂度很高的组合优化问题&#xff0c;在工业工程中有很广泛的应用背景。为实现个性化定制生产模式&#xff0c;企业会选择订单组批的方式&#xff0c;继而通过排样优化实现批量切割&#xff0c;加工完成后再按照不同客户需求进行分拣&#…

高质量短视频素材平台推荐

在当今短视频内容日益增长的时代&#xff0c;拥有高质量的素材显得尤为重要。以下是一些值得关注的短视频素材平台&#xff0c;它们各具特色&#xff0c;适合不同需求的创作者。 蛙学网 蛙学网专注于提供高质量的短视频素材&#xff0c;适合各种创作需求。虽然该平台需要订阅&a…

DerpNStink: 1渗透测试

靶机&#xff1a;DerpNStink: 1 <https://www.vulnhub.com/entry/derpnstink-1,221/> 攻击机&#xff1a;kail linux 2024 目标&#xff1a;获得4个flag 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现靶机 靶…

#HarmonyOS:页面和自定义组件生命周期

页面生命周期 即被Entry装饰的组件生命周期 onPageShow&#xff1a;页面每次显示时触发一次&#xff0c;包括路由过程、应用进入前台等场景。onPageHide: 页面每次隐藏时触发一次&#xff0c;包括路由过程、应用进入后台等场景。onBackPress: 当用户点击返回按钮是触发 组件…

自定义类型:联合和枚举【上】

自定义类型&#xff1a;数组&#xff0c;结构体&#xff0c;联合体&#xff0c;枚举。前面一些我们已经讲过了&#xff0c;接下来我们讲联合体和枚举。 一.联合体 1.联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成员可以不同…

网络搜索引擎Shodan(2)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 感谢泷…

(南京观海微电子)——GH7006-01_HKC_B3-PV043WVQ-N80_MIPI_LVDS_RGB原理及代码介绍

1. 原理 2. 代码 /**************************************************/ // Model - GV050WVQ-N82 // IC - GH7006 // Width - 800 // Height - 480 // REV: - V01 // DATA - 20240621 // INTERFACE- LV…

4.1.2 网页设计技术

文章目录 1. 万维网&#xff08;WWW&#xff09;的诞生2. 移动互联网的崛起3. 网页三剑客&#xff1a;HTML、CSS和JavaScriptHTML&#xff1a;网页的骨架CSS&#xff1a;网页的外衣JavaScript&#xff1a;网页的活力 4. 前端框架的演变基于CSS的框架基于JavaScript的框架基于MV…

质量漫谈一

我知道很多同学看到这类问题&#xff0c;第一反应想要去寻找的就是作为测试角色&#xff0c;应该要如何如何去做&#xff1f;但是今天这里作为质量第一篇&#xff0c;不打算按照这样单角度去写&#xff0c;这类同学可以就此打住&#xff0c;如果在意的话&#xff0c;可关注后续…

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…