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

相关文章

Java调用DeepSeek API的8个高频坑与解决方法

《Java调用DeepSeekAPI的8个高频坑与解决方法》现在大模型开发特别火,DeepSeek因为中文理解好、反应快、还便宜,不少Java开发者都用它,本文整理了最常踩的8个坑,希望对... 目录引言一、坑 1:Token 过期未处理,鉴权异常引发服务中断问题本质典型错误代码解决方案:实现 Token

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

gitlab项目实现添加新成员

《gitlab项目实现添加新成员》:本文主要介绍gitlab项目实现添加新成员方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录gitlabhttp://www.chinasem.cn项目添加新成员1、进入项目2、手动输入要添加成员的账号或者搜索总结gitlab项