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

相关文章

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

vscode-创建vue3项目-修改暗黑主题-常见错误-element插件标签-用法涉及问题

文章目录 1.vscode创建运行编译vue3项目2.添加项目资源3.添加element-plus元素4.修改为暗黑主题4.1.在main.js主文件中引入暗黑样式4.2.添加自定义样式文件4.3.html页面html标签添加样式 5.常见错误5.1.未使用变量5.2.关闭typescript检查5.3.调试器支持5.4.允许未到达代码和未定义代码 6.element常用标签6.1.下拉列表

局域网内vue2 配置本地IP地址访问项目

在日常开发中同事可能需要访问你的前端项目,可以通过配置实现通过ip访问 一.首先找到config文件夹目录下的 index.js文件             将此处的host的值修改为0.0.0.0(即 host: 0.0.0.0) // Various Dev Server settings//host: 'localhost' //将localhost进行替换成 0.0.0.0host: