API开放平台项目细节

2024-06-04 04:36
文章标签 项目 api 细节 开放平台

本文主要是介绍API开放平台项目细节,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.前端如何区分用户权限的,是管理员还是普通用户?

Ant Design Pro内置了一套权限管理机制,通过access.ts页面实现。它会去取到全局初始化状态(InitialState)的loginUser,根据当前登录用户判断是否有管理员权限。

canUser: loginUser,
//如果loginUser存在,并且用户角色为admain,说明该用户是管理员。
canAdmain: loginUser?.userRole === 'admain',

2.如何在项目中调用第三方接口?

项目中使用到了Hutool工具库中的Http客户端工具类——HttpUtil,它默认支持get和post的请求,

//可以单独传入http参数,这样参数会自动进行url编码,拼接在url中。
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("参数1","参数2");String result = HttpUtil.get(/post)("http://www.xxx.com",paramMap);

3.API签名认证

类似于向调用者签发许可证,有证才允许调用。

为什么需要API签名认证呢?

  • 保证安全性,不能让随便一个人就能调用。
  • 适用于无需保存登录态的场景。只认签名,不关注用户是否登录。

签名认证的两个过程:首先是签发签名,然后是校验签名。

如何在后端实现签名认证?需要accessKey和secretKey,类似于用户名和密码,每次调用接口都需要,实现无状态请求。如果只有一个Key的话,那么只要一个人拿到了这个Key就可以无限制调用,并不安全。就像登录时同时需要用户名和密码一样。

不仅要实现签名的认证,还要做到安全的传递。签名认证的实现是通过http request header头传递参数,包括aK和sK,这样就有可能存在攻击者中途拦截请求,从而获得sK,然后使用sK进行请求,因此通常不能将sK作为明文直接传递。

于是可以采用签名的形式,将sK进行加密,加密算法有对称加密(使用密钥)、非对称加密(公钥加密,私钥解密)、单向加密(MD5,无法解密)等。在项目是将用户的参数与sK进行拼接,然后再使用单向加密,将加密后的值发送给服务器,服务器去验证是否正确即可,这样也不会暴露sK。API接口再使用相同的参数进行加密生成,并与传递的参数进行对比,看是否一致。

同时为了避免重放攻击,又引入了两个参数,分别是nonce随机数和timestamp时间戳。随机数是在每次请求时都会发送一个给后端,后端只接受并认可该随机数一次,之后不再认可相同的随机数,但这样后端需要额外的开发来保存大量的随机数。时间戳是在每次发送请求时携带一个,并且后端会去验证该时间戳是否在合理的时间段内,比如不超过10分钟或5分钟,防止攻击者使用昨天的请求来进行重放。因此可以给随机数设置一个过期时间,然后配合时间戳一起使用。

通常,标准的签名认证算法中会建议添加至少5个参数,分别是:accessKey、secretKey、sign、nonce、timestamp。校验时去验证aK、nonce、时间戳。

 

签名认证的本质就是避免密码在服务器之间传输,因为在服务器间的传输很可能会被拦截。

项目中的实现:

签名算法使用Hutool工具类的加密算法——摘要加密,并将签名工具单独写成一个SignUtil。

public class SignUtils{public static String genSign(Map<String,String>hashMap,String secretKey){//使用SHA256算法的DigesterDigester md5 = new Digester(DigestAlgorithm.SHA256);//构建签名内容,将哈希映射转换为字符串并拼接密钥String content = hashMap.toString()+ "." +secretKey;//计算签名的摘要并返回摘要的十六进制表示形式return md5.digestHex(content);
}
}

这样客户端与服务端直接调用这个工具类去进行加密即可。

4.开发SDK

如果开发者在每次调用接口时都需要编写签名算法、生成随机数等,就会非常繁琐,通常情况下开发者只需要关注调用哪个接口、传递哪些参数即可。因此,开发一个简单已用的SDK,让开发者直接调用即可。所以给开发者提供一个starter,开发者直接在application.yml中引入相关配置,然后会自动创建相应的客户端。

5.@AuthCheck(mustRole = 'admin')注解

在创建管理员发布和下线接口代码时,只需要给两个接口打上这个注解即可实现仅管理员访问。

接口的实现原理如下:

即先获取用户登录的信息,然后判断用户是否具有管理员权限,没有则抛异常,有的话才继续执行。一种AOP切面的实现。

6.发布和下线接口(仅管理员可用)

发布:

  • 校验接口是否存在(根据id值)
  • 判断接口是否可调用(直接用之前开发的客户端SDK即可)
  • 修改数据库中的接口状态字段为1

下线:

  • 校验接口是否存在
  • 修改数据库中的接口状态字段为0

7.开发申请签名

因为用户在调用前需要获得aK和sK,所以每个用户要有自己专属的密钥。在用户注册时,会给用户分配一对专属的aK、sK。

在用户的注册流程中,增加一个生成密钥的步骤。项目中依然采用了Hutool工具类的加密算法,DigestUtil,使用md5Hex加密算法。

8.在线调用中有个关键点是,确定前端向后端发送请求时所需的信息,比如请求参数的类型。这里直接使用json类型,更灵活。

[{"name": "username", "type": "string"}
]

9.在线调用

 实际的让后端去调用接口,因此需要开发一个在线调用的后端。那么应如何将请求传递给真实的第三方接口呢?

在实际企业项目中,肯定不会采用第二种方式。如果模拟接口可以直接被调用,那么一定会存在安全风险,通常情况下,虽然前端可以直接调用模拟接口,但我们不会将模拟接口暴露给外部,而是将其隐藏起来,用户或开发者在调用时可能根本不知道接口的真实地址。假设后端地址为bbb.com/api,接口地址为aaa.com/api,后者是不对用户开放的,用户不知道它的存在。如果开发者可以直接调用,那么后续做的网关和计费等工作也是徒劳的。

调用流程:

  • 前端将用户输入的请求参数和将要调用的接口id发送给后端
  • 调用前可以做一些校验(暂时不做)
  • 后端调用模拟接口

在用户进行测试调用时,或者说在线体验时,需要告知后端用户的签名信息,这样才能判断用户是否具有权限。

这里有三种考虑,可根据具体情况选择:

  • 一是要求用户必须具有接口权限才能调用(也就是在数据库中用户必须有明确的密钥)
  • 二是即使用户没有权限,但也可以体验接口的功能。这需要为用户分配临时的签名,类似于测试环境,给予一定数量的调用次数。需要在数据库中新增字段,专门用来存储临时签名和测试调用次数。
  • 三是直接给每个用户提供免费几十次调用机会,做起来比较方便。

这篇关于API开放平台项目细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029075

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们