大厂案例 - 通用的三方接口调用方案设计(中)

news2024/11/18 0:44:19

文章目录

  • Pre
  • 阿里云
  • 华为云
  • 【AK和SK生成方案】最佳实践
    • 1. 创建API密钥管理系统
    • 2. 生成AK和SK
    • 3. 存储和管理AK和SK
    • 4. 提供API密钥分发机制
    • 5. 安全性
    • 6. 其他注意事项
  • DB Model Design
    • 表结构
    • Next考虑
    • 其他建议
  • API接口设计指导
    • 1. 使用POST作为接口请求方式
    • 2. 客户端IP白名单
    • 3. 单个接口针对IP限流
    • 4. 记录接口请求日志
    • 5. 敏感数据脱敏
    • 6. 幂等性问题
    • 7. 版本控制
    • 8. 响应状态码规范
    • 9. 统一响应数据格式
    • 10. 接口文档

在这里插入图片描述


Pre

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


阿里云

在这里插入图片描述

【AccessKey】

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


华为云

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


【AK和SK生成方案】最佳实践

设计API密钥管理系统是一项复杂且关键的任务,涉及生成、存储、分发和管理API密钥(包括Access Key和Secret Key),并确保系统的安全性。以下是设计API密钥管理系统的一些关键要素和最佳实践。

1. 创建API密钥管理系统

  • 系统架构: API密钥管理系统可以是一个独立的服务器应用,或者与你的主应用集成在一起。确保系统的架构符合你的业务需求和扩展性要求。
  • 核心功能: 包括生成和管理API密钥、分发机制、安全性保障等。

2. 生成AK和SK

  • AK(Access Key): AK是公开的标识符,用于标识客户的身份。可以使用随机字符串、UUID等方式生成,确保唯一且难以猜测。
  • SK(Secret Key): SK是用于生成身份验证签名和加密访问令牌的私钥。可以使用随机字符串、哈希函数等方式生成,确保其足够复杂和安全。
  • 密钥长度: 使用足够长的密钥长度,通常16字节以上,以确保其安全性。

3. 存储和管理AK和SK

  • 存储方式: 将AK和SK存储在数据库或其他持久化存储中,确保安全性。考虑使用加密的形式存储SK。
  • 权限控制: 实施严格的权限控制,确保只有授权的用户和系统组件可以访问AK和SK。
  • 加密处理: 对SK进行加密处理,确保即使数据库泄露,也无法轻易获取SK。
  • 关联客户信息: 将AK和SK与客户的其他相关信息关联,方便管理和查询。

4. 提供API密钥分发机制

  • 分发方式: 客户可以通过提供的界面、API或者自助注册流程来获取他们的AK和SK。确保分发过程的安全性。
  • 安全传输: 在分发过程中,使用加密连接(如HTTPS)或其他安全通道传递AK和SK,确保密钥不会被截获或泄露。
  • 身份验证: 在分发前,验证客户的身份,确保只有授权的客户才能获得AK和SK。

5. 安全性

  • 安全审计: 对API密钥管理系统进行安全审计,检查潜在的漏洞和安全风险。确保系统符合安全最佳实践。
  • 定期轮换: 定期轮换AK和SK,降低潜在风险。提供安全的密钥更新机制,确保客户在密钥轮换期间的业务连续性。
  • 身份验证和权限控制: 在设计接口时,使用AK和SK进行身份验证和权限控制,确保只有授权的访问请求被接受。
  • 监控和报警: 设置监控和报警机制,检测异常访问和潜在的安全风险。

6. 其他注意事项

  • 备份和恢复: 确保有备份和恢复机制,以防止数据丢失或系统故障。
  • 日志记录: 记录密钥生成、分发、访问等操作的日志,以便审计和排查问题。
  • 用户教育: 向客户提供安全使用API密钥的指南,提醒他们避免泄露和滥用密钥。

设计API密钥管理系统需要确保安全性、可靠性和可扩展性。通过合理的生成、存储、分发和管理机制,可以确保AK和SK的安全,并提供稳定的服务。


DB Model Design

CREATE TABLE api_credentials (
    id INT AUTO_INCREMENT PRIMARY KEY,
    app_id VARCHAR(255) NOT NULL,
    access_key VARCHAR(255) NOT NULL,
    secret_key VARCHAR(255) NOT NULL,
    valid_from DATETIME NOT NULL,
    valid_to DATETIME NOT NULL,
    enabled TINYINT(1) NOT NULL DEFAULT 1,
    allowed_endpoints VARCHAR(255),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

SQL表设计提供了管理API密钥信息的基础结构,定义了每个API密钥的属性和相关信息。

表结构

  • 表名: api_credentials - 这个表用于存储API密钥及其相关信息。
  • 主键: id - 自增的唯一标识符,确保每个记录在表中都是唯一的。
  • 应用程序ID: app_id - 用于将API密钥与特定应用程序关联,可以是一个字符串标识符。
  • 访问密钥: access_key - 公开的访问密钥,用于标识客户身份。通常使用随机字符串生成。
  • 秘密密钥: secret_key - 私有的密钥,用于签名和身份验证。需要高度保密,可能需要加密存储。
  • 有效期:
    • valid_from - AKSK有效期的起始时间。
    • valid_to - AKSK有效期的结束时间。
  • 启用状态: enabled - 用于指示该API密钥是否启用,1表示启用,0表示禁用。
  • 允许的端点: allowed_endpoints - 逗号分隔的允许访问的接口/端点列表,可能为空表示允许所有端点。
  • 创建时间: created_at - 自动记录创建时间,方便审计和日志记录。

Next考虑

  • 索引: 为app_idaccess_key等字段添加索引,以提高查询性能。确保查询操作高效,特别是身份验证过程。
  • 数据完整性: 确保app_idaccess_key具有唯一性,以避免重复的密钥。
  • 密钥的安全性: 考虑对secret_key进行加密存储,防止密钥泄露。可以使用对称加密算法加密,并在读取时解密。
  • 访问控制: 实施严格的访问控制,确保只有授权用户可以访问和管理这些数据。
  • 业务逻辑: 根据应用程序需求,可能需要添加其他字段。例如,描述字段、所属用户字段等,以满足业务需求。

其他建议

  • 轮换密钥: 设计一个机制来定期轮换API密钥,并确保旧密钥的安全销毁。
  • 日志记录和审计: 记录对API密钥的操作日志,便于安全审计和问题排查。
  • 异常处理: 设计处理密钥过期、禁用和其他异常的逻辑,确保应用程序的稳定性。

API接口设计指导

1. 使用POST作为接口请求方式

POST相对GET更安全,参数不会暴露在URL中,适合传递敏感信息。

  • 建议: 使用HTTPS加密传输,防止中间人攻击。对于不涉及敏感信息的读取操作,GET仍然可以使用。

2. 客户端IP白名单

通过限制访问IP,可以增加安全性。

  • 注意: 需谨慎处理IP迁移,确保白名单及时更新。考虑使用防火墙、反向代理等工具来管理白名单。

3. 单个接口针对IP限流

限流可以防止恶意请求,保护系统稳定性。

  • 实现方式: 使用Redis等内存数据库实现计数和过期机制,确保性能和实时性。
  • 注意: 设置合理的限流策略,防止误伤正常用户。

4. 记录接口请求日志

日志记录有助于问题排查和审计。

  • 建议: 使用AOP(面向切面编程)技术全局处理接口请求,记录必要信息。确保日志不包含敏感数据。

5. 敏感数据脱敏

在接口中处理敏感数据时,需要确保其安全性。

  • 建议: 使用RSA等非对称加密方式保护敏感数据。对于日志和错误信息,应确保脱敏处理,防止数据泄露。

6. 幂等性问题

幂等性确保多次请求产生相同结果。

  • 实现方式: 使用唯一随机数(如UUID)或请求ID确保幂等性。将请求ID存储在Redis中,防止重复请求。
  • 注意: 幂等性主要适用于POST、PUT、DELETE等会改变状态的请求。

7. 版本控制

为了保持API稳定性,需要引入版本控制。

  • 实现方式: 在API路径中加入版本号,如/v1/resource。确保不同版本的接口相互独立。
  • 注意: 避免破坏性更改,确保接口的向后兼容性。

8. 响应状态码规范

使用HTTP状态码可以帮助客户端理解响应结果。

  • 建议: 使用标准的HTTP状态码,200表示成功,4xx表示客户端错误,5xx表示服务器错误。
  • 扩展: 使用枚举类(Enum)定义状态码和消息,以确保代码的可读性和一致性。

9. 统一响应数据格式

统一响应格式可以简化客户端处理逻辑。

  • 实现方式: 定义统一的响应数据格式,包括状态码、信息描述、数据等。可以根据状态码判断请求结果。
  • 注意: 确保格式简单明了,方便客户端快速处理响应。

10. 接口文档

良好的接口文档可以提高开发效率,降低沟通成本。

  • 工具: 使用Swagger、Postman等工具生成和管理接口文档,方便开发和测试。
  • 建议: 确保文档与代码保持一致,避免因文档错误导致的混乱。文档应包含详细的接口描述、参数和示例。

在这里插入图片描述

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

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

相关文章

ROS服务器通信

目录 一、角色 二、流程 注意 三、例子描述 四、srv文件 编译配置文件 vscode配置 五、Server.cpp编写例子 编写CMakeList 六、观察server的效果 七、Client编写例子 编写CMakeList 八、观察Client的结果 九、Client优化(动态输入) 了解argc…

【网络编程下】五种网络IO模型

目录 前言 一.I/O基本概念 1.同步和异步 2.阻塞和非阻塞 二.五种网络I/O模型 1.阻塞I/O模型 2.非阻塞式I/O模型 ​编辑 3.多路复用 4.信号驱动式I/O模型 5. 异步I/O模型 三.五种I/O模型比较​编辑 六.I/O代码示例 1. 阻塞IO 2.非阻塞I/O 3.多路复用 (1)select …

STM32 F103C8T6学习笔记16:1.3寸OLED的驱动显示日历

今天尝试使用STM32 F103C8T6驱动显示 1.3寸的OLED,显示数字、字符串、汉字、图片等 本质与0.96寸的OLED是完全相同的原理: 而且经过我的研究发现: 1.3寸大小的OLED并未比0.96寸的有更多的显示像素点数来显示,也是128*64的像素点数显示: 也…

2024-5-4

今日流水账: 上午: 之前的那道 kernel pwn 已经成功构造了 dirty pipe 原语(:但是不知道为啥修改 /bin/busybox 一直报段错误,悲,后面在探索探索(:这里简单尝试写下 /etc/passwd&…

【架构系列】RabbitMQ应用场景及在实际项目中如何搭建可靠的RabbitMQ架构体系

作者:后端小肥肠 创作不易,未经允许禁止转载。 1. 前言 RabbitMQ,作为一款高性能、可靠的消息队列软件,已经成为许多企业和开发团队的首选之一。它的灵活性和可扩展性使得它适用于各种应用场景,从简单的任务队列到复杂的分布式系统…

eNSP-动态路由(ospf协议)

一、拓扑结构搭建 二、主机配置 pc1 pc2 三、路由器配置 1.AR2配置 <Huawei>sys #进入系统视图 [Huawei]int g0/0/0 #进入接口 [Huawei-GigabitEthernet0/0/0]ip address 192.168.0.2 24 #设置ip地址 [Huawei-GigabitEthernet0/0/0]q #返回上一级 [Huawei]int g0/0/1 …

asp.net结课作业中遇到的问题解决2

目录 1、如何实现评论交流的界面 2、如果想要将文字添加到数据库中&#xff0c;而不是乱码&#xff0c;该怎么修改 3、如果想要添加的数据已经存在于数据库&#xff0c;就不允许添加了&#xff0c;该如何实现 4、想要实现某个模块下有好几个小的功能该如何实现 5、想要实现…

Unity 性能优化之数据面板(Statistics)(一)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、unity 统计数据面板&#xff08;Statistics&#xff09;1.Audio属性2.Graphics属性 二、什么是Draw Call&#xff1f;三、Unity3D stats也可以通过代…

大型语言模型的新挑战:AMR语义表示的神秘力量

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 引言&#xff1a;AMR在大型语言模型中的作用 在自然语言处理&#xff08;NLP&#xff09;的领域中&#xff0c;抽象意义表示&…

【Android学习】自定义文本框和输入监听

实现功能 以上代码可实现功能&#xff1a; 1 自定义文本框样式 2. 文本框触发形式转变 3. 文本框输入长度监听&#xff0c;达到最大长度关闭软键盘 4. password框触发检测phone框内容 1. drawable自定义形状 我创建了editor_focus.xml 和 editor_unfocus.xml&#xff0c;两者仅…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

3.2Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3框架-企业级应用- Vuex

Vuex简介 Vuex概述 Vuex是一个专门为Vue.js应用程序开发的状态管理模式, 它采用集中式存储管理所有组件的公共状态, 并以相应的规 则保证状态以一种可预测的方式发生变化. 试想这样的场景, 比如一个Vue的根实例下面有一个根组件名为App.vue, 它下面有两个子组件A.vue和B.vu…

巧记英语单词

页面 在输入框中填写英语单词的谐音 这样的话就进行了一次英语单词的记忆练习。 页面代码 <% layout(/layouts/default.html, {title: 英语单词管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main">&l…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

练习题(2024/5/4)

1 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","…

学习Rust的第26天:Rust中的cp

在本文中复刻了 cp 实用程序的功能&#xff0c;我想默认使其递归&#xff0c;因为每次我想复制时都输入 -R 文件夹都会觉得有点重复&#xff0c;本文代码将与前文代码保持相似&#xff0c;我们只会更改程序的核心功能和一些变量名称以匹配用例 Pseudo Code 伪代码 function cop…

STM32G474 CMAKE VSCODE 开发环境搭建

本篇博文尝试搭建 stm32g474 的开发环境 一. 工具安装 1. 关于 MinGW、OpenOCD、Zadig 这些工具的下载和安装见 JlinkOpenOCDSTM32 Vscode 下载和调试环境搭建_vscode openocd stm32 jlink-CSDN博客 2. 导出一个 STM32 的 CMAKE 工程&#xff0c;这里略过。 3. 安装 ninja …

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

langchain+qwen1.5-7b-chat搭建本地RAG系统

已开源&#xff1a;https://github.com/stay-leave/enhance_llm 概念 检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;是一种结合语言模型和信息检索的技术&#xff0c;用于生成更准确且与上下文相关的输出。 通用模型遇到的问题&#xff0c;也是…