当前位置: 首页 > 后端技术 > Java

Java接口签名(Signature)实现方案

时间:2023-04-01 17:00:50 Java

Java接口签名(Signature)实现方案大家好,我是田程序员!今天早上,我接到一个请求,要为当前系统开发一个开放接口。由于是对外开放的,调用方肯定没有我们系统的Token,所以调用方需要进行签名验证。签名验证采用主流的验证方式,使用Signature方法。一、需求具体需求如下图所示二、流程1.离线分配appid和appsecret,给不同的调用者分配不同的appid和appsecret  2.添加timestamp(时间戳),10分钟内数据有效  3.添加序列号noncestr(防止重复提交),至少10位。对于查询接口,序列号只用于日志登陆,方便后期日志校验。对于处理接口,需要验证序列号在有效期内的唯一性,避免重复请求。  4。添加签名,所有数据的签名信息。3.实现简单来说就是在body中传递调用接口的业务参数,在header中增加四个附加参数signature、appkey、timestamp、noncestr。我们在后台获取四个参数,最后三个参数加上调用方分配的appSecret,经过字典排序,MD5加密,然后与第一个参数签名进行比对,即表示调用方有调用权限。以下代码是接口校验签名的demo实现://referencejacksondepends@AutowiredprivateObjectMapperobjectMapper;@Value("${appsecret}")privateStringappSecret;/***验证签名*@parampreInfoItem*@return*/booleancheckSignature(PreInfoItempreInfoItem)throwsJsonProcessingException,IllegalAccessException{Stringsignature="signature";字符串appkey="appkey";字符串时间戳=“时间戳”;字符串noncestr="noncestr";HttpServletRequestrequest=ServletUtils.getRequestad(=request.getHeader(signature);StringheaderAppkey=request.getHeader(appkey);StringheaderTimestamp=request.getHeader(timestamp);StringheaderNoncestr=request.getHeader(noncestr);//因为排序是需要,直接用TreeMapMapparms=newTreeMap<>();parms.put(appkey,headerAppkey);parms.put(timestamp,headerTimestamp);parms.put(noncestr,headerNoncestr);MapstringObjectMap=objectToMap(parms,preInfoItem);字符串s=buildSignature(stringObjectMap);//签名比较if(s.equals(headerSignature)){returntrue;}返回假;}MapobjectToMap(Mapmap,Objecto){Field[]declaredFields=o.getClass().getDeclaredFields();for(Fieldfield:declaredFields){field.setAccessible(true);try{if(field.getName()instanceofString){map.put(field.getName(),field.get(o));}}catch(IllegalAccessExceptione){thrownewCustomException("对图像转地图异常");}}返回地图;}privateStringbuildSignature(Mapmaps){Strings2;尝试{StringBuffers=null;字符串s1=objectMapper.writeValueAsString(地图);//添加appSecrets.append(s1).append(appSecret);s2=DigestUtils.md5DigestAsHex(s.toString().getBytes());}catch(JsonProcessingExceptione){thrownewCustomException("map转json异常");}返回s2;}好吧,让我们试试吧!