淘宝/京东/拼多多三方接口调用设计方案

news2024/11/20 3:32:09

在为第三方系统提供接口的时候,肯定要考虑接口数据的安全问题,比如数据是否被篡改数据是否已经过时数据是否可以重复提交等问题

在设计三方接口调用的方案时,需要考虑到安全性和可用性。以下是一种设计方案的概述,其中包括使用API密钥(Access Key/Secret Key)进行身份验证和设置回调地址。

设计方案概述

  1. API密钥生成:为每个三方应用生成唯一的API密钥对(AK/SK),其中AK用于标识应用,SK用于进行签名和加密。

    AK:Access Key Id,用于标示用户。
    SK:Secret Access Key,是用户用于加密认证字符串和用来验证认证字符串的密钥,其中SK必须保密。
    通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。

  2. 接口鉴权:在进行接口调用时,客户端需要使用AK和请求参数生成签名,并将其放入请求头或参数中以进行身份验证。

    淘宝签名和验签:淘宝SDK签名算法 (yuque.com)

  3. 回调地址设置:三方应用提供回调地址,用于接收异步通知和回调结果。

  4. 接口API设计:设计接口的URL、HTTP方法、请求参数、响应格式等细节。

权限划分

  • appID:应用的唯一标识

    用来标识你的开发者账号的, 即:用户id, 可以在数据库添加索引,方便快速查找,同一个 appId 可以对应多个 appKey+appSecret,达到权限的

  • appKey:公匙(相当于账号)

    公开的,调用服务所需要的密钥。是用户的身份认证标识,用于调用平台可用服务.,可以简单理解成是账号。

  • appSecret:私匙(相当于密码)

    签名的密钥,是跟appKey配套使用的,可以简单理解成是密码。

  • token:令牌(过期失效)

使用方法

  1. 向第三方服务器请求授权时,带上AppKey和AppSecret(需存在服务器端)

  2. 第三方服务器验证appKey和appSecret在数据库、缓存中有没有记录

  3. 如果有,生成一串唯一的字符串(token令牌),返回给服务器,服务器再返回给客户端

  4. 后续客户端每次请求都需要带上token令牌

为什么 要有appKey + appSecret 这种成对出现的机制呢,?

  • 因为要加密通常用在首次验证(类似登录场景), 用 appKey(标记要申请的权限有哪些) + appSecret(密码, 表示你真的拥有这个权限)来申请一个token, 就是我们经常用到的 accessToken(通常拥有失效时间), 后续的每次请求都需要提供accessToken 表明验证权限通过。

现在有了统一的appId,此时如果针对同一个业务要划分不同的权限,比如同一功能,某些场景需要只读权限,某些场景需要读写权限。这样提供一个appId和对应的秘钥appSecret就没办法满足需求。此时就需要根据权限进行账号分配通常使用appKey和appSecret。

  • 由于 appKey 和 appSecret 是成对出现的账号同一个 appId 可以对应多个 appKey+appSecret, 这样平台就为不同的appKey+appSecret对分配不一样的权限,

    • 可以生成两对appKey和appSecret。一个用于删除,一个用于读写,达到权限的细粒度划分。如 : appKey1 + appSecect1 只有删除权限 但是 appKey2+appSecret2 有读写权限… 这样你就可以把对应的权限 放给不同的开发者。其中权限的配置都是直接跟appKey 做关联的, appKey 也需要添加数据库索引, 方便快速查找


简化的场景:

  • 第一种场景:通常用于开放性接口,像地图api,会省去app_id和app_key,此时相当于三者相等,合而为一 appId = appKey = appSecret, 。这种模式下,带上app_id的目的仅仅是统计某一个用户调用接口的次数而已了。

  • 第二种场景: 当每一个用户有且仅有一套权限配置 可以去掉 appKey, , 直接将app_id = app_key, 每个用户分配一个appId+ appSecret就够了`.

也可以

可以采用签名(signature)的方式:当调用方向服务提供方法发起请求时,带上(appKey、时间戳timeStamp、随机数nonce、签名sign) 签名sign 可以使用 (AppSecret + 时间戳 + 随机数)使用sha1、md5生成,服务提供方收到后,生成本地签名和收到的签名比对,如果一致,校验成功

签名流程

图片

签名规则

  1. 分配appId(开发者标识)appSecret(密钥),给 不同的调用方

    可以直接通过平台线上申请,也可以线下直接颁发。appId是全局唯一的,每个appId将对应一个客户,密钥appSecret需要高度保密。

  2. 加入timeStamp(时间戳),以服务端当前时间为准,单位为ms ,5分钟内数据有效

    时间戳的目的就是为了减轻DOS攻击。防止请求被拦截后一直尝试请求接口。服务器端设置时间戳阀值,如果服务器时间 减 请求时间戳超过阀值,表示签名超时,接口调用失败。

  3. 加入临时流水号nonce至少为10位 ,有效期内防重复提交

    随机值nonce 主要是为了增加签名sign的多变性,也可以保护接口的幂等性,相邻的两次请求nonce不允许重复,如果重复则认为是重复提交,接口调用失败。

    通过在接口签名请求参数加上 时间戳timeStamp + 随机数nonce 可以防止 ”重放攻击“
    1.时间戳(timeStamp):
    以服务端当前时间为准,服务端要求客户端发过来的时间戳,必须是最近60秒内(假设值,自己定义)的。
    这样,即使这个请求即使被截取了,也只能在60s内进行重放攻击。
    2.随机数(nonce):
    但是,即使设置了时间戳,攻击者还有60s的攻击时间呢!
    所以我们需要在客户端请求中再加上一个随机数(中间黑客不可能自己修改随机数,因为有参数签名的校验呢),
    服务端会对一分钟内请求的随机数进行检查,如果有两个相同的,基本可以判定为重放攻击。
    因为正常情况下,在短时间内(比如60s)连续生成两个相同nonce的情况几乎为0

    服务端“第一次”在接收到这个nonce的时候做下面行为:
    1.去redis中查找是否有key为nonce:{ nonce}的数据
    2.如果没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间一致,比如是60s。
    3.如果有,说明这个key在60s内已经被使用了,那么这个请求就可以判断为重放请求。

    • 针对查询接口,流水号只用于日志落地,便于后期日志核查。

    • 针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。

  4. 加入签名字段sign,获取调用方传递的签名信息。

    通过在接口签名请求参数加上 时间戳appId + sign 解决身份验证和防止 ”参数篡改“
    1.请求携带参数appId和Sign,只有拥有合法的身份appId和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题。
    2.即使请求参数被劫持,由于获取不到appSecret(仅作本地加密使用,不参与网络传输),也无法伪造合法的请求。

以上字段放在请求头中。

API接口设计

根据你的具体需求和业务场景,以下是一个简单示例的API接口设计:

1. 获取资源列表接口

  • URL: /api/resources

  • HTTP 方法: GET

  • 请求参数:

    • page (可选): 页码

    • limit (可选): 每页限制数量

  • 响应:

    • 成功状态码: 200 OK

    • 响应体: 返回资源列表的JSON数组

2. 创建资源接口

  • URL: /api/resources

  • HTTP 方法: POST

  • 请求参数:

    • name (必填): 资源名称

    • description (可选): 资源描述

  • 响应:

    • 成功状态码: 201 Created

    • 响应体: 返回新创建资源的ID等信息

3. 更新资源接口

  • URL: /api/resources/{resourceId}

  • HTTP 方法: PUT

  • 请求参数:

    • resourceId (路径参数, 必填): 资源ID

    • name (可选): 更新后的资源名称

    • description (可选): 更新后的资源描述

  • 响应:

    • 成功状态码: 200 OK

4. 删除资源接口

  • URL: /api/resources/{resourceId}

  • HTTP 方法: DELETE

  • 请求参数:

    • resourceId (路径参数, 必填): 资源ID

  • 响应:

    • 成功状态码: 204 No Content

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

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

相关文章

盒子模型-详解

一、盒子模型组成 所谓盒子模型:就是把HTML页面中的布局元素看作是一个矩形的盒子也就是一个盛装内容的容器。css盒子模型本质是一个盒子,封装周围的HTML元素,包括边框、外边距、内边距和实际内容。 margin:外边距 用于控制盒子与盒子之间的…

【ROS导航Navigation】一 | 概述

目录 致谢:ROS赵虚左老师 一、【概述】二狗子找大水法 Navigation全图 二、【SLAM】即时定位与地图构建 三、【AMCL】自适应蒙特卡洛定位 四、【Move_base】路径规划 五、【cmd_vel】运动控制 六、环境感知 致谢:ROS赵虚左老师 Introduction A…

多行业用户齐聚,2023 IoTDB 用户大会详细议程更新!

上周我们官宣了 2023 IoTDB 用户大会举办的消息,获得了多方小伙伴们积极的响应,作为第一次线下大会,我们已经开始期待与大家线下相见! 为了回应大家对于大会内容的期待,我们火速把更加详细的议程“搬运”来啦~ 20 位大…

【亚马逊云科技】使用Amazon Lightsail快速建站

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成…

Webpack Bundle Analyzer包分析器

当我们需要分析打包文件dist里哪些资源可以进一步优化时,就可以使用包分析器插件webpack-bundle-analyzer。NPM上的介绍是使用交互式可缩放树图可视化 webpack 输出文件的大小。 我的是vue2项目。 1、webpack-bundle-analyzer插件的安装 $ npm install --save-dev…

Python数据容器(集合)

集合 1.集合的定义2.集合中常用操作4.常用功能总结5.集合的特点6.练习 思考? 我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为何要学新的集合类型呢? 通过特性分析 列表可以修改、支持重复元素且有序元组、字符串不可修…

Scala---方法与函数

一、Scala方法的定义 有参方法&无参方法 def fun (a: Int , b: Int) : Unit {println(ab) } fun(1,1)def fun1 (a: Int , b: Int) ab println(fun1(1,2)) 注意点: 方法定义语法 用def来定义可以定义传入的参数,要指定传入参数的类型方法可以写返…

【Java】线程的调度、生命周期及状态转换

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:夜色难免黑凉,前行必有曙光 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ ​ 文章目录 一.&…

3.1 Linux 前置知识

1、硬件 我们知道,组成计算机的硬件主要有“主机”和“输入/输出设备”。 主机包括机箱、电源、主板、CPU(Central Processing Unit,中央处理器)、内存、显卡、声卡、网卡、 硬盘、光驱等。输入/输出设备包括显示器、键盘、鼠标…

王道数据结构课后代码题p40 6.有一个带头结点的单链表L,设计一个算法使其元素递增有序 (c语言代码实现)

这一题其实用到了直接插入排序的思想 视频讲解在这里哦:👇 p40 第6题 王道数据结构课后代码题 c语言代码实现_哔哩哔哩_bilibili 本题代码为 void paixu(linklist* L)//对单链表内的元素排序 {lnode* p (*L)->next;lnode* pre *L;lnode* r p-&…

「 电商API接口系列之淘宝API接口调用 」

API从技术角度来说就是应用程序编程接口。通过API我们可以直接获取一些我们需要的数据结果,而不需要自己编写相应的程序,有点类似模块化调用函数,大大加快了我们编程的速度。当然这个数据传输是需要网络的,所以一般API的形式看起来…

论文十问:ResNet(Deep Residual Learning for Image Recognition)

文章目录 1. 论文试图解决什么问题?2. 这是否是一个新的问题?3. 这篇文章要验证一个什么科学假设?4. 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?5. 论文中提到的解决方案之关键是什么?6. 论文中的实验是如何设计的?…

stable diffusion comfyui的api使用教程

一、为什么要使用comfyui的api?对比webui的api,它有什么好处? 1、自带队列 2、支持websocket 3、无需关心插件是否有开放api接口,只要插件在浏览器中可以正常使用,接口就一定可以使用 4、开发人员只需关心绘图流程的搭建 5、切换…

【LeetCode刷题笔记】二叉树(二)

257. 二叉树的所有路径 解题思路: 1. DFS 前序遍历 ,每次递归将 当前节点的拼接结果 传递到 下一层 中,如果当前节点是 叶子节点 ,就将 当前拼接结果 收集答案并返回。 注意:路径path结果可以使用 String 来拼接,这样可以避免回溯处理。

Git 本地库基本教程

目录 一. Git 概述 1.1 何为版本控制 1.2 为什么需要版本控制 1.3 版本控制工具 1.3.1 集中式版本控制工具 1.3.2 分布式版本控制系统 1.4 Git简介 1.5 Git工作机制 1.6 Git 和代码托管中心 1.6.1 局域网 1.6.2 互联网 二. Git 安装 三. Git…

SystemC 学习之与 System Verilog 的混合仿真(九)

1、下载 uvmc (uvm connect) https://download.csdn.net/download/yp18792574062/88529417?spm1001.2014.3001.5501 2、配置相关环境变量 export UVM_HOME${VCS_HOME}/etc/uvm export UVMC_HOME/home/yangpan/yangpan/uvmc/uvmc-2.3.1 然后执行 source ~/.zshrc 更新 3、…

让公有云服务“宁安如梦”的“定心丸”在哪里?

电视剧《宁安如梦》正在热播中,该剧讲述了主人公在经历人生的重大风险后,重获新生再活一遍,以确定性的方式抵御和化解原有的重大风险。然而,在现实的生活中,却没有这样的重来机会。 2023年11月13日,Gartne…

二、服务拆分及远程调用

目录 一、注意事项: 1.单一职责: 2.数据独立: 3.面向服务: 二、服务拆分例子: 三、远程调用例子: 微服务调用方式: 四、提供者与消费者 服务调用关系: 一、注意事项: 1.单一职责: 不同…

某建筑网页js逆向分析过程(有坑)

某建筑网页: 网站: import base64 # 解码 website base64.b64decode(aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55.encode(utf-8)) print(website)JSON.parse() ​ 当你有一个包含JSON字符串的变量时,你可以使用JSON.parse()将…

No209.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…