上文《自动生成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这个方法。最后按照惯例,附上本案例的源码,登陆后即可下载。



还没有评论,来说两句吧...