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

文章目录

  • 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.mzph.cn/web/6613.shtml

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

相关文章

【研发管理】产品经理知识体系-产品创新流程

导读:产品创新流程是一个系统性的过程,旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…

Java与Go:并发

在此之前,我们先要明白什么是并发?为什么要并发编程? 在计算机中,同一时刻,只能有一条指令,在一个CPU上执行 后面的指令必须等到前面指令执行完才能执行,就是串行。在早年CPU核心数还少的时候倒…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置,然后在project的build.gradle.kts中使用如下方式引入: apply(from "./config.gradle") 缺点:在project的module中引用无任何提示,无法跳转到指定引用 一、创建versio…

临床+康复的一体化治疗服务,把握黄金康复时间

随着我院脑血管病人,重症病人及骨科病人康复需求的日渐增多,为了使每位住院患者在治疗原发病的同时,第一时间接受到康复治疗,提高病人的生活质量,降低致残率,我院康复治疗科在院领导的大力支持下&#xff0…

C语言之递归函数、例题详解以及注意事项

目录 前言 一、递归的概念 二、递归例题详解 例1:斐波那契数列 例2:求次方 例3:求各位数之和 例4:阶乘 例5:顺序打印 三、递归的注意事项 总结 前言 本文将和大家分享一些递归函数的相关知识,技巧…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色:保存最近使用的多个颜色&…

vue快速入门(五十三)使用js进行路由跳转

注释很详细&#xff0c;直接上代码 上一篇 新增内容 几种常用的路由跳转方式演示 源码 App.vue <template><div id"app"><div class"nav"><!-- router-link 自带两个高亮样式类 router-link-exact-active和router-link-active区别&a…

3.SpringSecurity基本原理

SpringSecurity本质是一个过滤器链。十多个过滤器构成一个过滤器链。 这些过滤器在项目启动就会进行加载。每个过滤器执行放行操作才会执行下一个过滤器。 常见过滤器 FilterSecurityInterceptor 是一个方法级的权限过滤器&#xff0c;基本位于过滤器链的最底部。 Excepti…

Rust web简单实战

一、使用async搭建简单的web服务 1、修改cargo.toml文件添加依赖 [dependencies] futures "0.3" tokio { version "1", features ["full"] } [dependencies.async-std] version "1.6" features ["attributes"]2、搭…

HTML_CSS学习:CSS盒子模型

一、CSS中常用的长度单位 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>CSS中常用的长度单位</title><style>html{font-size: 40px;}#d1{/*第一种长度单位&…

开源模型应用落地-LangChain高阶-Tools工具-集成agents(四)

一、前言 LangChain 的 tools 是一系列关键组件&#xff0c;它们提供了与外部世界进行交互的能力。通过适当的使用这些组件&#xff0c;可以简单实现如执行网络搜索以获取最新信息、调用特定的 API 来获取数据或执行特定的操作、与数据库进行交互以获取存储的信息等需求。 本章…

安装vscode基础配置,es6基础语法,

https://code.visualstudio.com/ es6 定义变量 const声明常量&#xff08;只读变量&#xff09; // 1、声明之后不允许改变 const PI “3.1415926” PI 3 // TypeError: Assignment to constant variable. // 2、一但声明必须初始化&#xff0c;否则会报错 const MY_AGE /…

01-MySQL 基础篇笔记

一、MySQL 概述 1.1 数据库相关概念 数据库&#xff1a;&#xff08;DB&#xff1a;DataBase&#xff09; 存储数据的仓库&#xff0c;数据是有组织的进行存储 数据库管理系统&#xff1a;&#xff08;DBMS&#xff1a;DataBase Management System&#xff09; 操作和管理数…

java spring 09 Bean的销毁过程

1.Bean销毁是发送在Spring容器关闭过程中的 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);UserService userService (UserService) context.getBean("userService");userService.test();// 容器关闭cont…

手撕spring框架(5)

手撕spring框架(5) 相关系列 手撕spring框架&#xff08;1&#xff09; 手撕spring框架&#xff08;2&#xff09; 手撕spring框架&#xff08;3&#xff09; 手撕spring框架&#xff08;4&#xff09; 这是本专题最后一节了&#xff0c;主要是讲述自定义一个注解&#xff0c;实…

14_Scala面向对象编程_属性

属性 1.类中属性声明 // 1.给Scala声明属性&#xff1b;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值&#xff0c;为了解决此问题可以采用下划线赋值&#xff0c;表示系统默认赋值 , –但是此方法局限于变量&…

太阳能光伏光热综合利用(PVT)

PVT系统介绍 传统太阳能系统是太阳光直接加热水&#xff0c;效率高&#xff0c;但是需要有防冻措施&#xff0c;且在太阳光不充足时需要增加电辅热&#xff0c;受天气影响大&#xff0c;且电加热能耗高。传统发电是将直流电转化为交流电&#xff0c;再提供给用户使用。此PVT技…

特斯拉全自动驾驶系统Tesla‘s Full-Self Driving (FSD)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Overview Tesla’s FSD is a suite of features that includes Autopilot, Navigate on Autopilot, Auto Lane Change, Autopark, Summon, and Traffic Light and Stop Sig…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

力扣每日一题104:二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2…