本文主要是介绍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开放平台项目细节的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!