大长案例 - 通用的三方接口调用方案设计

文章目录

  • 引言
    • 身份验证
    • 防止重复提交
    • 数据完整性和加密
    • 回调地址
    • 安全事件响应
    • 可用性
  • 设计方案概述
    • 1. API密钥生成
    • 2. 接口鉴权
    • 3. 回调地址设置
    • 4. 接口API设计
  • 权限划分
    • 权限划分概述
      • 1. 应用ID(AppID)
      • 2. 应用公钥(AppKey)【(相当于账号)】
      • 3. 应用私钥(AppSecret)【(相当于密码)】
      • 4. 令牌(Token)
    • 使用方法
    • 其他注意事项
  • Why AppKey 和 AppSecret 成对出现?
    • 1. 安全性
    • 2. 多样性
    • 3. 灵活性
    • 4. 应用Id的统一
  • 场景
    • 第一种场景:开放性接口(AppID = AppKey = AppSecret)
    • 第二种场景:固定权限配置(AppID = AppKey)
    • 签名机制:签名+时间戳+随机数
    • 适用场景
  • 签名流程
  • 签名规则

在这里插入图片描述


引言

在为第三方系统提供接口时,关键是确保数据的完整性、安全性和防止重复提交。以下是一个基于API密钥(Access Key/Secret Key)和回调机制的设计方案,具有多层次的安全保障。

身份验证

  • API密钥:每个第三方系统都会获得一对唯一的密钥组合,包括Access Key和Secret Key。这些密钥用于验证API请求的合法性。
  • 签名验证:每个请求必须包含使用Secret Key生成的签名,以确保数据在传输过程中没有被篡改。签名生成通常结合请求内容和时间戳,以确保签名的时效性和防止重放攻击。

防止重复提交

  • 唯一请求ID:在请求中包含唯一的请求ID,以防止重复提交。同一个请求ID不能重复使用。
  • 时间戳和过期时间:在请求中添加时间戳,并设置请求的有效期。超过有效期的请求将被拒绝。

数据完整性和加密

  • 传输层安全性:使用HTTPS等安全传输协议,确保数据在传输过程中不会被窃听或篡改。
  • 数据加密:对于敏感数据,考虑在传输前进行加密,确保只有授权方才能解密。

回调地址

  • 验证回调地址:为了确保接口调用的安全性,使用预先注册的回调地址。这样可以防止未授权的地址访问。
  • 回调结果签名:当第三方系统接收回调时,验证回调数据的签名,确保数据的完整性和真实性。

安全事件响应

  • 异常检测和报警:设置异常检测机制,监控异常请求和异常行为。一旦发现异常,及时报警并采取措施。
  • 审计和日志:记录所有API请求和响应日志,以便在发生安全事件时进行审计和分析。

可用性

  • 负载均衡和冗余:确保系统的高可用性,通过负载均衡和冗余设计,避免单点故障。
  • 监控和故障恢复:设置实时监控机制,检测系统故障,并确保快速恢复。

设计方案概述

1. API密钥生成

为每个第三方应用生成唯一的API密钥对,以确保唯一标识和安全性。

  • Access Key (AK): 用于标识应用。每个第三方应用应拥有独特的Access Key。
  • Secret Key (SK): 用于生成签名和进行加密。Secret Key应当被严格保密,避免外泄。

生成方法:

  • 使用安全随机数生成一对API密钥,确保其唯一性和不可预测性。
  • 将Access Key分配给应用,Secret Key应仅提供给被授权的个人或系统,并要求妥善保管。

2. 接口鉴权

当客户端调用接口时,需要通过签名进行身份验证。

  • 签名生成: 使用Secret Key和请求参数(通常包含时间戳、请求路径、请求参数等)生成签名。常用的签名方法包括HMAC-SHA256等。
  • 签名验证: 在服务器端,通过Access Key找到对应的Secret Key,使用相同的算法验证签名。

在请求中传递签名的方法:

  • 将签名放入请求头,例如AuthorizationSignature字段。
  • 或者,将签名作为查询参数或请求体中的参数传递。

3. 回调地址设置

设置第三方应用的回调地址,用于接收异步通知和回调结果。

  • 安全验证: 确保回调地址是预先注册的,以防止未授权的地址进行请求。
  • 签名验证: 回调返回的数据应该携带签名,客户端验证签名确保数据完整性。

4. 接口API设计

在设计接口API时,应考虑以下因素:

  • URL结构: 使用清晰的URL结构和命名,方便理解。
  • HTTP方法: 根据操作类型选择合适的HTTP方法,例如GET用于读取数据,POST用于创建数据,PUT用于更新数据,DELETE用于删除数据。
  • 请求参数: 定义请求所需的参数,包括必要和可选参数,确保文档清晰。
  • 响应格式: 选择标准的响应格式(如JSON),并在响应中包含状态码、错误信息和数据内容。

权限划分

权限划分概述

在设计系统权限和认证机制时,重要的是确保身份验证的安全性,并防止未经授权的访问。 关于应用ID、AppKey、AppSecret和Token在权限划分中的角色及其使用方法的概述如下。

1. 应用ID(AppID)

  • 唯一标识:每个应用都有唯一的AppID,用于标识不同的开发者账号。它在数据库中作为索引,方便快速查找。
  • 多钥匙配置:一个AppID可以对应多个AppKey和AppSecret,达到权限的精细化划分。

2. 应用公钥(AppKey)【(相当于账号)】

  • 公匙:AppKey是公开的密钥,相当于账号,用于身份认证。它代表了应用的身份,必须在服务器端验证。
  • 调用平台服务:当需要访问第三方服务时,客户端需要提供AppKey,以表明自身的身份。

3. 应用私钥(AppSecret)【(相当于密码)】

  • 私匙:AppSecret相当于密码,它是与AppKey配套使用的,必须保密。用于生成签名,以确保请求的真实性。
  • 签名验证:服务器通过AppSecret对请求进行签名验证,确保请求未经篡改。

4. 令牌(Token)

  • 临时凭证:Token是一个唯一的字符串,用于在一定时间内代表客户端的授权状态。它有时效性,过期后需重新获取。
  • 授权流程
    • 当客户端请求授权时,需提供AppKey和AppSecret。
    • 服务器验证AppKey和AppSecret,确认其有效性。
    • 如果验证成功,服务器生成Token,并将其返回给客户端。
    • 客户端在后续请求中使用Token,以证明自己已通过身份验证。
  • 令牌的管理:服务器应妥善管理Token,包括其生成、验证和过期机制。

使用方法

  • 请求授权:客户端在请求授权时,需带上AppKey和AppSecret。服务器验证后生成Token并返回。
  • 持续认证:在后续的请求中,客户端需携带Token,以保持授权状态。
  • Token管理:服务器需要管理Token的生命周期,包括设置过期时间,处理Token刷新等。

其他注意事项

  • 过期处理:Token的有效期应根据业务需求设置,确保安全性,同时避免频繁重新认证。
  • 多重身份验证:对于高安全性的应用,考虑使用多重身份验证,例如通过短信、电子邮件进行额外验证。
  • 日志记录:记录Token的使用和生成日志,以便于审计和问题排查。

Why AppKey 和 AppSecret 成对出现?

AppKey 和 AppSecret 是身份验证和权限管理机制中的常见组合。

在应用开发和第三方服务中,它们成对出现的原因包括以下几点:

1. 安全性

  • 加密和签名:AppSecret 是一个私有密钥,它通常用于生成加密签名。AppKey 和 AppSecret 的组合提供了一种安全验证机制,确保只有持有正确密钥的人才能成功通过身份验证。
  • 防止篡改:由于 AppKey 公开可见,AppSecret 的加入确保了请求的完整性。通过 AppSecret 生成的签名可以验证请求是否被篡改。

2. 多样性

  • 多种应用场景:一个应用可能有不同的功能模块或业务场景,这些场景需要不同的权限。使用成对的 AppKey 和 AppSecret 允许为不同的场景配置不同的权限。
  • 细粒度权限划分:在同一个 AppId 下,多个 AppKey 和 AppSecret 允许细粒度的权限控制。例如,一个 AppKey 可以用于读写权限,另一个 AppKey 可能仅用于只读权限。

3. 灵活性

  • 灵活分配权限:成对的 AppKey 和 AppSecret 机制允许灵活分配权限。不同的 AppKey 可以与不同的权限配置关联,方便根据需求进行细粒度权限划分。
  • 权限管理的方便性:通过不同的 AppKey 和 AppSecret 对,可以为不同的开发者、团队或系统分配不同的权限。这种机制提供了灵活性,使得权限管理更加方便。

4. 应用Id的统一

  • 唯一标识:AppId 用于标识特定的应用或业务。但一个 AppId 可能需要在不同场景下使用不同的权限。通过 AppKey 和 AppSecret 的组合,可以在同一个 AppId 下区分不同的权限。
  • 满足多种需求:即使在同一个业务中,也可能需要多种权限配置。成对的 AppKey 和 AppSecret 允许在统一的 AppId 下,实现多样化的权限需求。

因为要加密, 通常用在首次验证(类似登录场景),用 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 也需要添加数据库索引, 方便快速查找


场景

在软件开发中,接口认证和权限管理的模式有多种不同的变种。这里简要讨论三种不同的场景,以及它们在使用中所体现的特点和优劣:

第一种场景:开放性接口(AppID = AppKey = AppSecret)

在开放性接口中,例如地图API,通常省去复杂的身份验证过程,仅依赖一个简单的AppID进行接口调用。其特点包括:

  • 简化接口调用:由于没有复杂的身份验证逻辑,开发者调用接口更加方便。这种模式适用于低安全性或公共数据接口。
  • 主要用于统计:AppID 仅用于统计用户的接口调用次数或量,而不是用于权限控制。适合数据开放或不需要高安全性的场景。
  • 安全性较低:由于没有严格的身份验证机制,这种方式的安全性较低,容易受到滥用或恶意攻击的影响。

第二种场景:固定权限配置(AppID = AppKey)

在这种场景中,每个用户有且仅有一套权限配置。这种设计方式的特点包括:

  • 简化权限管理:由于每个用户只有一个AppID和AppSecret,权限配置较为固定,不需要复杂的多密钥管理。
  • 适用于单一应用场景:当一个用户只有一种权限配置时,这种方式非常有效。减少了多密钥管理的复杂性。
  • 安全性取决于AppSecret:虽然这种方式没有AppKey的灵活性,但AppSecret仍然用于身份验证和签名,确保请求的安全性。

签名机制:签名+时间戳+随机数

通过签名机制,确保请求的真实性和防止重放攻击。这种方式的特点包括:

  • 签名生成:签名是由AppSecret、时间戳和随机数生成的,通常使用SHA-1或MD5等加密算法。签名用于验证请求的完整性和真实性。
  • 时间戳和随机数:时间戳用于防止请求的过期或重放攻击,随机数增加了签名的不可预测性,进一步提高了安全性。
  • 服务器端验证:服务器收到请求后,根据相同的签名生成方法,验证签名的正确性。如果签名一致,表明请求有效。

适用场景

  • 开放性接口:适用于公开数据和低安全性需求的场景。
  • 固定权限配置:适用于单一权限配置的场景,用户只需要AppID和AppSecret。
  • 签名机制:适用于需要确保请求真实性和防止重放攻击的场景,通常在更高安全性的接口中使用。

这三种场景提供了不同的接口认证和权限管理方式。开发者可以根据应用的具体需求选择合适的方式。在选择时,需要权衡安全性、灵活性和复杂性,以确保系统的可靠性和安全性。


签名流程

在这里插入图片描述

签名规则

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

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

相关文章

蒸发式工业冷风机

工业冷风机是一种专为工业环境设计的降温设备,它通过水蒸发吸热的原理来降低环境温度。以下是关于工业冷风机降温的一些详细信息: 降温原理: 工业冷风机(也称为蒸发式冷风机或蒸发式冷却机)利用“水蒸发吸收热量”的物…

Linux基础——Linux开发工具(上)vim

前言:在了解完Linux基本指令和Linux权限后,我们有了足够了能力来学习后面的内容,但是在真正进入Linux之前,我们还得要学会使用Linux中的几个开发工具。而我们主要介绍的是以下几个: yum, vim, gcc / g, gdb, make / ma…

pyqt拖入图片并显示

pyqt拖入图片并显示 介绍效果代码 介绍 像拖入文本一样,把图片拖入到窗体中显示。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt5.QtGui import QPixmap, QDragEnterEvent, QDropEvent from PyQt5.Q…

嵌入式C语言教程:使用DMA控制的UART通信

在许多嵌入式系统中,UART(通用异步接收/发送)是一种常见的通信协议,用于低速串行数据传输。 通过DMA(直接内存访问)控制UART通信,可以有效地释放CPU资源,使其能够处理其他计算任务。…

一种基于YOLOv8改进的高精度红外小目标检测算法 (原创自研)

💡💡💡本文摘要:一种基于YOLOv8改进的高精度小目标检测算法, 在红外小目标检测任务中实现暴力涨点; 💡💡💡创新点: 1)SPD-Conv特别是在处理低分…

安防监控/智能分析EasyCVR视频汇聚平台海康/大华/宇视摄像头国标语音GB28181语音对讲配置流程

一、背景分析 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接入协议各不相同,终端制造商需要给每款终端维护提供各种不同平台的软件版本,造成了极大的资源浪…

Flask 3 保姆级教程(一):快速上手

一、创建项目 PyCharm 中新建项目 创建完成后会出现这么个项目 以下是代码解析: # 导入了 Flask 类 from flask import Flask# 创建了一个 Flask web 应用的实例,并将其赋值给变量 app # __name__ 是一个特殊的 Python 变量,它表示当前模块…

conda env list找不到anaconda/envs下的环境。Could not find conda environment。

home/用户名/anaconda3/envs中的环境与conda env list下显示的环境不一致。 想进入home/用户名/anaconda3/envs中的环境,显示环境不存在。 重点!!!(conda activate 环境地址 可进入环境) 这一步最重要&…

springboot mongodb分片集群事务

前置 mongodb分片集群想要使用事务,需要对应分片没有仲裁节点 代码 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.1.0.RELEASE</version></d…

解决NetworkManager覆盖/etc/resolv.conf的问题

发布时间&#xff1a;2024.4.27 问题 /etc/resolv.conf是Linux下DNS的配置文件。 但是NetworkManager会用覆盖它&#xff0c;导致我们每次都要重新配置。 解决办法 这是官方推荐的做法。或者你可以用resolveconf工具。 $ nm-connection-editor会调起一个界面&#xff0c;…

AI视频教程下载:用ChatGPT提示词开发AI应用和GPTs

在这个课程中&#xff0c;你将深入ChatGPT的迷人世界&#xff0c;学习如何利用其能力构建创新和有影响力的工具。你将发现如何创建不仅吸引而且保持用户参与度的应用程序&#xff0c;将流量驱动到你的网站&#xff0c;并开辟新的货币化途径。 **课程的主要特点&#xff1a;** …

聊聊Mysql的两阶段提交

从图中可看出&#xff0c;事务的提交过程有两个阶段&#xff0c;就是将 redo log 的写入拆成了两个步骤&#xff1a;prepare 和 commit&#xff0c;中间再穿插写入bin log&#xff0c;具体如下&#xff1a; prepare 阶段&#xff1a;将 事务的修改写入到 redo log&#xff0c;同…

软件测试的内容包含什么内容

软件测试的内容涵盖了多个方面&#xff0c;以确保软件的质量和性能达到既定的标准。这些内容包括但不限于以下几点&#xff1a; 注册信息验证&#xff1a;对软件产品的基本信息进行验证&#xff0c;如软件名称、版本号、开发者等&#xff0c;确保这些信息的准确性和一致性。功…

图论单源最短路径——spfa

【模板】单源最短路径&#xff08;弱化版&#xff09; 本题用的spfa 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到…

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

单片机Debug的这几种方式,你都知道吗?

目录 一、仿真器调试 二、调试器调试 三、逻辑分析仪分析波形 四、示波器捕捉信号 五、串口调试 六、LED/蜂鸣器/显示屏调试 七、单元测试 嵌入式工程师在对单片机进行编程、结果验证、查找bug都需要用到调试的方法&#xff0c;用来进行调试定位&#xff0c;方便找出应…

相对通用大模型,企业更需要适合自身的英智私有化大模型

通用大模型虽然能在多个领域表现出强大的能力&#xff0c;但应用在特定行业时&#xff0c;表现效果并不能达到预期。因为这些模型在训练过程中并没有使用到特定行业的数据和专业知识&#xff0c;它们并不能理解和处理行业的问题。 相比之下&#xff0c;适合自身行业的私有化大…

从零开始构建大语言模型(MEAP)

原文&#xff1a;annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型&#xff08;LLM&#xff09;背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

OpenTK:安装和说明

OpenTK介绍 OpenTK是一个开源、跨平台的游戏开发库&#xff0c;由MonoGame团队创建。它为C#开发者提供了一个简单易用的接口&#xff0c;以便使用OpenGL、OpenAL和OpenCL进行3D渲染、音频处理和并行计算。OpenTK的目标是提供一个一致且高效的框架&#xff0c;让开发者能够专注于…

IDEA 编码规约扫描 Code inspection did not find anything to report.

IDEA安装了Alibaba Java Coding Guidelines插件&#xff0c;却看不到规约检查结果。手动进行编码规约扫描&#xff0c;弹窗提示“Code inspection did not find anything to report.”&#xff1a; 这种情况是因为代码文件所在的目录被标记成了测试文件&#xff08;Test Source…