详解Java接⼝签名(Signature)实现⽅案
⽬录
⼀、要求
⼆、流程
三、实现
⼤家好,我是程序员⽥同学!
今天上午收到⼀个需求,针对当前的系统开发⼀个对外开放的接⼝。
既然是对外开放,那么调⽤者⼀定没有我们系统的Token,就需要对调⽤者进⾏签名验证,签名验证采⽤主流的验证⽅式,采⽤Signature 的⽅式。
⼀、要求
下图为具体要求
⼆、流程
1、线下分配appid和appsecret,针对不同的调⽤⽅分配不同的appid和appsecret
2、加⼊timestamp(时间戳),10分钟内数据有效
3、加⼊流⽔号noncestr(防⽌重复提交),⾄少为10位。针对查询接⼝,流⽔号只⽤于⽇志落地,便于后期⽇志核查。针对办理类接⼝需校验流⽔号在有效期内的唯⼀性,以避免重复请求。
4、加⼊signature,所有数据的签名信息。
三、实现
简单来说,调⽤者调⽤接⼝业务参数在body中传递,header中额外增加四个参数signature、appkey、timestamp、noncestr。
我们在后台取到四个参数,其后三个参数加上调⽤者分配的appSecret,使⽤字典排序并使⽤MD5加密后与第⼀个参数signature进⾏⽐对,⼀致既表⽰调⽤者有权限调⽤。
以下代码为接⼝验证签名的demo实现:
/
/引⽤jackson依赖
@Autowired
private ObjectMapper objectMapper;
@Value("${appsecret}")
private String appSecret;
/**
* 验证签名
* @param preInfoItem
* @return
*/
boolean checkSignature(PreInfoItem preInfoItem) throws JsonProcessingException, IllegalAccessException {
签名字符串是什么String signature="signature";
String appkey="appkey";
String timestamp="timestamp";
String noncestr="noncestr";
HttpServletRequest request = Request();
String headerSignature = Header(signature);
String headerAppkey = Header(appkey);
String headerTimestamp = Header(timestamp);
String headerNoncestr = Header(noncestr);
//因为需要排序,直接使⽤TreeMap
Map<String,Object> parms=new TreeMap<>();
parms.put(appkey,headerAppkey);
parms.put(timestamp,headerTimestamp);
parms.put(noncestr,headerNoncestr);
Map<String, Object> stringObjectMap = objectToMap(parms, preInfoItem);
String s = buildSignature(stringObjectMap);
//签名⽐对
if (s.equals(headerSignature)){
return true;
}
return false;
}
Map<String,Object> objectToMap(Map<String,Object> map,Object o){
Field[] declaredFields = o.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
try {
if (Name() instanceof String){
map.Name(),(o));
}
}catch (IllegalAccessException e){
throw new CustomException("对象转map异常");
}
}
return map;
}
private String buildSignature(Map<String,Object> maps){
String s2;
try {
StringBuffer s = null;
String s1 = objectMapper.writeValueAsString(maps);
//添加appSecret
s.append(s1).append(appSecret);
s2 = DigestUtils.String().getBytes());
}catch (JsonProcessingException e){
throw new CustomException("map转json异常");
}
return s2;
}
到此这篇关于Java接⼝签名(Signature)实现⽅案的⽂章就介绍到这了,更多相关Java接⼝签名内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论