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

相关文章

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理