XAPI项目架构:应对第三方签名认证的设计与调整

news2024/12/24 9:55:35

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)
该项目是基于鱼皮的《API开发平台》项目的需求和架构设计上进行Golang版本开发的。
这篇文章,主要内容是记录在《XAPI项目》的原架构上,为了应对第三方签名认证的设计,而对原架构的调整修改。

目录

  • 原设计架构
  • 遇到的问题:当【第三方项目】需要验证自己项目的签名认证时,其AK/SK参数应该放在原架构的哪个部分编写?
    • 先试着逐个考虑:
      • 1. 放在【客户端SDK】
        • 结论:不合适
      • 2. 放在【API网关】
        • 结论:不合适
  • 对架构进行修改
    • 架构变更后说明:
      • 1. 提供聚合SDK,仅供API后端使用
      • 2. 提供客户端SDK,可供用户使用
      • 3. 原网关部分,需要提到API后端内
      • 4. 架构上删除API网关

📢 以下观点仅代表个人观点,不一定反映原架构设计的意图,也可能是我对原架构设计目的的理解不足。如果有任何错误或遗漏之处,请随时指出。

原设计架构

这是原设计架构下的调用接口业务的全流程图:
在这里插入图片描述

遇到的问题:当【第三方项目】需要验证自己项目的签名认证时,其AK/SK参数应该放在原架构的哪个部分编写?

在该项目设计中,本就有API签名认证(属于API后端项目设计的),所以需要第三方项目来找API后端验证,而项目中为了方便第三方项目的入驻,架设了API网关,统一帮助第三方项目做API签名认证,所以第三方就不需要来找API后端验证了。这里只是满足了入驻到API后端的校验条件。

但是,对于不同的第三方项目,他们都有自己的设计,所以也会存在自己的API签名认证(属于第三方自己设计的)。如果第三方有自己的API签名认证,那么无论是谁(包括API项目)请求他们接口服务的时候,都要按照其要求进行签名制作(AK、SK将来自于第三方项目系统)。

📢 如果说,该项目设计上,是限制入驻的第三方必须对我方请求的接口都不设置他们的API签名认证拦截的话,如果存在这一硬性条件,那后面的就无需看了,也就是该问题本就不存在。

先试着逐个考虑:

在流程中,请求第三方业务的起始点是从客户端SDK内发出的。所以先从这里考虑:

1. 放在【客户端SDK】

客户端SDK的功能:内部集成了所有入驻的第三方接口协议的请求编码。只需要传递所需的参数就能调用对应第三方接口服务。

使用方:所有人
因为该SDK是公开的,每个人都可以下载,只不过里面发出的请求URL都是指向API网关的,如果不是API后端的用户,都会被访问拦截,无法使用该服务。也就是说,保护第三方实际业务的方式,是通过隐藏真实的服务请求URL。但其余所需的参数这里都写好了。

这里其实就存在安全隐患了
大多第三方服务都有提供接口文档的(比如:Steam、苹果、Google等等),因为公开接口协议本身是很正常的,而要使用其提供的服务,一般都需要使用第三方项目提供的AK、SK,然后根据其设计的签名算法,编写出正确的参数,才能成功访问其服务。

  • 如果第三方没有这部分设计,那么只要在网上查找他们真实服务的请求URL,替换掉客户端SDK内的请求地址,就能绕过API网关,直接访问到第三方项目了。

  • 如果第三方有这部分设计,那么编写其设计签名部分的代码 ,这里写在客户端SDK内。需要考虑第三方要求的AK、SK如何拿到?但是这里无论使用什么方式拿到AK、SK(比如作为参数传入、或者直接写在客户端SDK内),都是不安全的,因为只要用户拿到AK、SK信息,他就能绕过API网关,直接访问到第三方项目。

结论:不合适

2. 放在【API网关】

API网关的定义:架构网关时,就对其定义为用于统一的做事情。
这里第三方项目是各不相同的,他们存在自己设计的签名算法,比如有的需要和所有参数一起生成签名,有的需要按照一定的顺序排序后再生成签名,有的拼接参数时需要使用特定的符号,由于这些特殊性,这块是没法抽象出统一的规则来生成签名的。所以需要对每个第三方项目编写特定的代码。这里违背了该API网关的统一做事情的定义。(PS:如果该定义能被打破,那确实可以放在这里,问题得到解决。但是一般项目的核心定义是不应该被改变的。特别这里API网关已经是微服务级别了,其定义更不应该随便修改。)

结论:不合适

对架构进行修改

在这里插入图片描述

架构变更后说明:

1. 提供聚合SDK,仅供API后端使用

在原客户端SDK内,实现对接第三方项目的所有协议编码,包含第三方自己的签名算法部分,所需AK、SK参数由调用方传递,也可以写死在该客户端SDK内(只不过写死的话,如果值变更了,需要修改代码重新编译发布)。另外该SDK仅对API后端项目暴露,不再对外暴露。也就是说它其实只是API后端里的代码,只是业务较为独立,可以单领出来方便维护。

2. 提供客户端SDK,可供用户使用

内部包含所有入驻的第三方项目的调用函数,参数是明确个数的、类型确定的,对于调用者来说使用上是非常方便的,无需了解API后端的协议,无需组装json等格式的参数。方便开发者快速接入,该客户端SDK也不与第三方项目直接交互,只是作为与API后端的链接桥梁。而API后端内也不会使用该客户端SDK。

3. 原网关部分,需要提到API后端内

因为客户端SDK直接调用的是API后端的接口,所以API后端就需要有访问控制、签名校验等。

4. 架构上删除API网关

因为真正访问第三方项目的服务是API后端,而服务端之间的通信可以通过IP验证来保证来源方有效性。

而对于原API网关中的签名校验,因为之前的客户端SDK是直接请求到API网关的,所以需要对来源做校验过滤,而在现在的结构下,客户端SDK是直接请求到API后端的,相关校验过滤已经在API后端内做过了。(或者在API后端前架构一个小网关,让客户端SDK直接请求,然后小网关过滤了之后再转到API后端。不过这样的设计我个人觉得只需要把相关的代码从形式上独立维护即可,不需要真正的作为一个小网关部署)

而对于原API网关中的接口统计,可以放在API后端的主逻辑上,在拿到聚合SDK结果后,统一处理接口统计即可。

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

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

相关文章

SpringBoot 的版本、打包、Maven

一、SpringBoot 结构、集成 1.1、集成组件 Spring Core:Spring的核心组件,提供IOC、AOP等基础功能,是Spring全家桶的基础。 Spring Boot:一个基于Spring Framework的快速开发框架,可以快速创建独立的、生产级别的…

chatgpt综述和报告

ChatGPT究竟强在哪?复旦大学邱锡鹏教授《大型语言模型的能力分析与应用》_哔哩哔哩_bilibili2022年底,美国OpenA1公司发布了ChatGPT,一个可以与人类对话交互的千亿规模参数的大型语言模型。它可以根据用户输入的指令完成各种语言相关的任务&a…

elasticsearch14-高亮

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…

HTML 学习笔记(基础)

它是超文本标记语言&#xff0c;由一大堆约定俗成的标签组成&#xff0c;而其标签里一般又有一些属性值可以设置。 W3C标准&#xff1a;网页主要三大部分 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript <!DOCTYPE html> <html lang"zh-…

【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理

Godot 4.1 因为我在游戏中发现&#xff0c;越运行游戏变得越来越卡&#xff0c;当你使用 Node 节点中的 print_orphan_nodes() 方法打印信息的时候&#xff0c;会出现如下的孤儿节点信息 孤儿节点信息是以 节点实例ID - Stray Node: 节点名称(Type: 节点类型) 作为格式输出&a…

Linux管理多版本node.js

这里介绍的是Linux版本的nvm工具&#xff1a;一个nodejs版本管理工具&#xff01; 这里可以灵活切换node指定版本哟~ 下载地址&#xff1a;https://github.com/nvm-sh/nvm/releases/ 1.安装 需要先安装git、curl yum install -y git curl这里很慢&#xff0c;需要登录。 如果…

C语言指向二维数组的四种指针以及动态分配二维数组的五种方式

文章目录 应用场景可能指向二维数组的指针动态分配二维数组 应用场景 当二维数组作为结构成员或返回值时&#xff0c;通常需要根据用户传递的参数来决定二维数组的大小&#xff0c;此时就需要动态分配二维数组。 可能指向二维数组的指针 如果现在有一个二维数组a[3][2]&…

机械寿命预测(基于NASA C-MAPSS数据的剩余使用寿命RUL预测,Python代码,CNN_LSTM模型,有详细中文注释)

1.效果视频&#xff1a;机械寿命预测&#xff08;NASA涡轮风扇发动机剩余使用寿命RUL预测&#xff0c;Python代码&#xff0c;CNN_LSTM模型&#xff0c;有详细中文注释&#xff09;_哔哩哔哩_bilibili 环境库版本&#xff1a; 2.数据来源&#xff1a;https://www.nasa.gov/int…

指针和数组笔试题讲解(2)

&#x1f435;本篇文章将会对上篇一维数组笔试题的剩余部分和二维数组的笔试题进行讲解 一、一维数组 1>试题部分(一)✏️ char* p "abcdef";printf("%zd\n", sizeof(p)); printf("%zd\n", sizeof(p 1)); printf("%zd\n", sizeo…

Linux 创建目录

语法&#xff1a;mkdir xxx Linux路径 在当前目录下创建文件夹 在/目录下创建文件夹 如果想要一次性创建多个层级的目录&#xff0c;如下图 会报错&#xff0c;因为上级目录test并不存在&#xff0c;所以无法创建test目录 可以通过-p选项&#xff0c;将一整个链条都创建完成…

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL 编译工具准备编译OpenSSL建立Hello World工程创建VS工程 编译工具准备 安装好Visual Studio。安装Perl, 主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好Open SSL源代码。 编译OpenSSL 安装Perl,并加入到path路径&#xff0c;检验…

【JAVA-Day18】用大白话讲解 Java 中的内存机制

标题 用大白话讲解 Java 中的内存机制摘要引言一、Java 内存机制1.1 栈内存1.2 堆内存 二、Java 如何管理内存三、合理管理内存的必要性与其他方式相比优势劣势建议四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《…

idea创建springboot项+集成阿里连接池druid

创建项目并集成流程 1&#xff1a;前提准备2&#xff1a;创建springboot项目流程3&#xff1a;集成阿里连接池步骤4&#xff1a;集成swagger方便测试5&#xff1a;书写增删改查进行测试6&#xff1a;项目gitee地址 1&#xff1a;前提准备 准备开发工具&#xff1a;idea java环…

UI自动化测试实践

一、设计背景 随着IT行业的发展&#xff0c;产品愈渐复杂&#xff0c;web端业务及流程更加繁琐&#xff0c;目前UI测试仅是针对单一页面&#xff0c;操作量大。为了满足多页面功能及流程的需求及节省工时&#xff0c;设计了这款UI 自动化测试程序。旨在提供接口&#xff0c;集…

Blazor前后端框架Known-V1.2.15

V1.2.15 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazo…

Linux下的系统编程——守护进程、线程(十二)

前言&#xff1a; 我们知道进程拥有一个PCB&#xff0c;在Linux中被称为task_struct,并且有一个进程地址空间&#xff0c;也有一个页表&#xff0c;通过页表指向物理内存&#xff0c;但是从今天开始&#xff0c;对进程的概念可能发生变化&#xff0c;这个我们后边来说&#xf…

【微信小程序】项目初始化

| var() CSS 函数可以插入一个自定义属性&#xff08;有时也被称为“CSS 变量”&#xff09;的值&#xff0c;用来代替非自定义 属性中值的任何部分。 1.初始化样式与颜色 view,text{box-sizing: border-box; } page{--themColor:#ad905c;--globalColor:#18191b;--focusColor…

通过Vcpkg直接安装Qt静态链接免编译的方式

Vcpkg支持自动编译Qt静态链接版&#xff0c;大约只需要30min左右&#xff0c;解决编译困扰和配置环境带来的各种影响。 一、查找Qt包 https://vcpkg.io/en/packages 输入qt5可找到qt5版本&#xff0c;如果需要安装最新的qt6&#xff0c;可直接输入qt&#xff0c;如下: 二、修…

操作系统存储器章节知识梳理

&#x1f525;&#x1f525;宏夏Coding网站&#xff0c;致力于为编程学习者、互联网求职者提供最需要的内容&#xff01;网站内容包括求职秘籍&#xff0c;葵花宝典&#xff08;学习笔记&#xff09;&#xff0c;资源推荐等内容。在线阅读&#xff1a;https://hongxiac.com&…

关于阻抗不连续的原因

1、连线中的分支结构 信号传输到分支结构处&#xff0c;表现出的是两条电路并联的效果&#xff0c;会导致阻抗的不连续问题。典型的就是菊花链结构。 2、参考平面的宽度 一般情况下参考平面都是很宽且连续的&#xff0c;但有的时候&#xff0c;参考平面会被反焊盘给掏空…