上文《自动生成appid和appsecret的案例教程》我们介绍了自动生成appid和appsecret的案例。既然生成了,我们如何使用呢?
在我们生产环境,经常会涉及到为第三方系统提供某个接口,但是为了接口安全,我们经常会做一些验签的案例,因此这里的话我们结合这里的appid和appsecret介绍下相关的验签案例。
在实际生产中,我们对应的appid和appsecret的常用用法是:
1、使用appsecret对某个字段进行aes加密和解密用。 2、拼接appsecret,对请求参数进行验签。
这里我们介绍的主要是第二种方式,这种方式是怎么样的呢?我们来列举下我们在生产中是如何使用的:
客户端部分:
1、客户端在request header头里面传递appid 2、客户端把某个接口的所有参数再加上appsecret拼接在一起,然后把整个字符串进行MD5加密成为sign字段。 3、客户端把所有的参数和sign字段一起拼接成json,然后请求服务器。
服务端部分:
1、服务端从request header头里面查询出appid 2、服务端根据appid从数据库或者缓存里面查询出来appsecret。 3、服务端把所有参数加上appsecret拼接在一起,然后把整个字符串进行MD5加密。 4、服务端把加密的结果与客户端传递的sign字段进行比对,成功则代表是安全的,可以放通请求,失败则代表是错误的,不放通请求。
所以这里的话,我们来介绍下服务端如何使用,编写一个服务端的代码,示例如下:
@RequestMapping("/getProductInfo") public BaseResponsePoJo hello(@RequestHeader(value = "appId", required = true) String appId, @RequestBody ProductRequest request) throws Exception { //首先假装从数据库或者缓存中获取到了Appid对应的AppSecret String appSecret = "aaaa"; //接着把model转换成json,然后转换成map,然后使用sotedmap进行ascll排序组成字符串最后得到sign String productRequestString = JSON.toJSONString(request); HashMap<String, Object> map = JSON.parseObject(productRequestString, new TypeReference<HashMap<String, Object>>(){}); String sign = SignatureUtils.generateSign(map,appSecret); if(sign.equals(request.getSign())){ return BaseResponsePoJo.ok(); } return BaseResponsePoJo.fail(); }
这里拼接字符串的相关模块核心代码是:
public static String generateSign(HashMap<String, Object> params, String secret) { if (CollUtil.isEmpty(params)) { return ""; } //把appSecret自动添加进去 params.put("appSecret", secret); //一般前端有model,所以我们自动把sign字段移除掉 params.remove("sign"); //把map转换成TreeMap SortedMap<String, Object> param = new TreeMap<>(params); //拼接字符串 StringBuilder paramValueStr = new StringBuilder(); for (String item : param.keySet()) { paramValueStr .append(item) .append("=") .append(param.get(item)) .append("&"); } //把最后一葛&符号给去掉 String signStr = paramValueStr.toString().substring(0, paramValueStr.toString().length() - 1); String sign = AesUtils.md5(signStr); System.out.println("加密的原始字符串是:" + signStr + ", md5的值是:" + sign); //执行md5 return sign; }
编写完成之后,我们测试一下:
这里客户端请求的时候,传递参数和根据参数加密后的sign字段。服务器端成功完成校验,说明是没问题的,接着我们再改动下客户端的数据:
可以看到此时服务端验签就失败了,会直接提示失败的错误信息。
以上案例就是实现服务端和客户端接口交互验签的案例教程,客户端这里我们直接使用postman演示的,实际的核心代码主要还是generateSign这个方法。最后按照惯例,附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...