1.请求报文
出于安全考虑,加密和签名是必不可少的,据此,基本的字段应该有:
- encType 加密方式,如aes
- signType 签名方式,如MD5
- signData 签名结果
- busiName 请求的业务接口名
- busiData 业务数据(这个数据是经过encType指定的算法加密过后的密文,并非明文)
通常还有防重放的要求,增加如下两个字段:
- timeStamp 时间戳
- nonce 随机数
如果是一对一的接口,以上字段就够用了;如果是一对多(多个客户端),还需要增加clientId来区分每个客户端。一个请求报文的实例如下:
{
"encType":"aes",
"signType":"md5",
"signData":"03b588f517cd3f9b3e702022b4195b52",
"busiName":"user.info",
"busiData":"6M1133yyTothav0APxDAd+C4TFkDektkLgFcCjlQx11=",
"timeStamp":"1506391864652",
"nonce":"02569838",
"clientId":"holic_01"
}
2.响应报文
响应报文的变化主要有一是增加了处理结果编码和处理结果描述,二是去掉了防重放的nonce字段,基本字段应包含如下:
- resultCode 返回码
- resultMsg 返回状态描述
- encType 加密方式
- signType 签名方式
- signData 签名结果
- busiName 请求的业务接口名
- busiData 业务数据
- timeStamp 时间戳
还是贴一个示例吧
{
"encType":"aes",
"signType":"md5",
"signData":"03b588f517cd3f9b3e702022b4195b52",
"busiName":"user.info",
"busiData":"6M1133yyTothav0APxDAd+C4TFkDektkLgFcCjlQx11=",
"timeStamp":"1506391864652",
"resultMsg":"处理成功",
"resultCode":"0000"
}
大概说一下接口的工作原理。请求过来时,先验证是否是重复请求:去Redis中查找有没有key为nonce的字符串,没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间置成一致,比如是120s;如果有,说明这个nonce在120s内已经被使用了,那么这个请求就可以判断为重放请求,直接不处理。通过重放验证后,再验证签名:根据和客户端约定的规则对入参进行签名,签名一致则进行后续操作;不一致说明中途被篡改,不予处理。 下一篇文章会对参数的处理进行比较详细的说明,本篇到此结束。