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

《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.rhkb.cn/news/140513.html

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

相关文章

js中的数据结构:栈,队列,链表,字典哈希表,树

栈:先进后出 队列:先进先出 链表: 单链表: 双链表: 环形链表:最后一个数据的next指针不是指向null,指向的是任意之间的一个数据,形成一个环 数组和链表的区别: 字典和哈…

Docker Desktop 界面功能介绍,添加国内镜像源

目录 镜像源修改设置 其他偏好设置 镜像源修改设置 默认情况下,Docker Desktop会从Docker Hub下载镜像,但在国内由于网络的原因,下载速度可能较慢,配置国内镜像源可以提速镜像下载。在Docker Desktop中配置镜像源非常简单&…

LLM各层参数详细分析(以LLaMA为例)

网上大多分析LLM参数的文章都比较粗粒度,对于LLM的精确部署不太友好,在这里记录一下分析LLM参数的过程。 首先看QKV。先上transformer原文 也就是说,当h(heads) 1时,在默认情况下, W i Q W_i^…

2023/09/20 day4 qt

做一个动态指针钟表 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> //绘制事件类 #include <QPaintEvent> //画家类 #include <QTime> #include <QTimer> #include <QTimerEvent> QT_BEGIN…

用于设计 CNN 的 7 种不同卷积

一 说明 最近对CNN架构的研究包括许多不同的卷积变体&#xff0c;这让我在阅读这些论文时感到困惑。我认为通过一些更流行的卷积变体的精确定义&#xff0c;效果和用例&#xff08;在计算机视觉和深度学习中&#xff09;是值得的。这些变体旨在保存参数计数、增强推理并利用目标…

rtsp转webrtc的其他几个项目

1&#xff09; mpromonet/webrtc-streamer &#xff08;c开发&#xff09; 把rtsp转webrtc&#xff0c; 通过 load urls from JSON config file ./webrtc-streamer -C config.json 通过exe文件和docker项目实际测试可以显示&#xff0c;但不太稳定加载慢,有时候出错后很难…

7.15 SpringBoot项目实战 【学生入驻】(上):从API接口定义 到 Mybatis查询 串讲

文章目录 前言一、service层 和 dal层方式一、Example方式方式二、Mybatis XML方式方式三、Mybatis 注解方式 二、web层 StudentController最后 前言 接下来我们实战【学生入驻】&#xff0c;对于C端学生端&#xff0c;一切交互开始于知道 当前学生是否入驻、是否有借阅资格&a…

LeetCode 753. 破解保险箱【欧拉回路,DFS】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

java字符串压缩和字符串解压

java字符串压缩和字符串解压 运行效果 java工具类 CompressUtil.java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.apache.commons.codec.binary.Base64;import java.io.BufferedReader; import java.io.Byte…

el-form自定义规则后表单验证validate不生效的问题

1.首先放出结论&#xff0c;自定义验证规则必须降所有的可能全部都return callback出去&#xff0c;不然不会走validate 错误示范 // template <el-formref"ruleFormRef":model"ruleForm":rules"rules"label-width"120px"class&qu…

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&am…

Visio——绘制倾斜线段

一、形状 -> 图表和数学图形 -> 多行 二、放置多行线&#xff0c;可以发现存在两个折点 三、选择多行线&#xff0c;右键选择删除点&#xff0c;即可得到倾斜线段

C进阶-数据的存储

数据类型介绍 内置类型&#xff1a; //数据类型中的内置类型 // char //字符数据类型 // short //短整型 // int //整型 // long //长整型 // long long //更长的整型 // float //单精度浮点数 // double //双精度浮点数 //数据类型中的内置类型 单位是字节 // char //字…

PyCharm 手动下载插件

插件模块一直加载失败&#xff0c;报错信息&#xff1a; Marketplace plugins are not loaded. Check the internet connection and refresh. 尝试了以下方法&#xff0c;均告失败&#xff1a; pip 换源Manage Plugin Repositories...HTTP 代理设置...关闭三个防火墙 最后选…

《动手学深度学习 Pytorch版》 7.4 含并行连接的网络(GoogLeNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.4.1 Inception块 GoogLNet 中的基本卷积块叫做 Inception 块&#xff08;大概率得名于盗梦空间&#xff09;&#xff0c;由 4 条并行路径组成。 前 3 条路径使用窗口…

华为云云耀云服务器L实例评测|使用云耀云服务器L实例,自行搭建NextCloud

背景 本人是搞分布式存储的&#xff0c;一心想搭个网盘&#xff0c;发现L实例里面就有个网盘实例最低配置是2核4G&#xff0c;为了节省成本&#xff0c;选个【2核2G】的配置&#xff0c;一样可以搭起来。 简介 Nextcloud是一款开源免费的私有云存储网盘项目&#xff0c;可以让…

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术&#xff0c;不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…

DATE和LocalDateTime在Java中有什么区别

在Java中&#xff0c;Date和LocalDateTime是两个表示日期和时间的类&#xff0c;它们有以下区别&#xff1a; 类型&#xff1a;Date是Java旧版提供的日期和时间类&#xff0c;而LocalDateTime是Java 8引入的新日期和时间API中的类。 不可变性&#xff1a;Date是可变类&#x…

深入理解C#中委托的使用及不同类型委托的应用示例

在C#中&#xff0c;委托是一种强大而灵活的机制&#xff0c;可以引用一个或多个方法&#xff0c;并允许以类似函数指针的方式进行调用。委托在事件处理、回调函数和多线程编程等场景中非常有用。本文将深入探讨C#中委托的使用&#xff0c;并介绍不同类型委托的应用示例。 目录…

Fiddler抓包工具配置+Jmeter基本使用

一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前&#xff0c;得先学会如何抓包&#xff0c;这里以Fiddler为例。会抓包的同学可以跳过这一步&#xff0c;当然看看也是没坏处的…… 局域网络配置 将要进行抓包的手机与电脑连入同一局域网&#xff0c;电脑才能够抓到…