尝试设计一个对外接口

1.请求报文

出于安全考虑,加密和签名是必不可少的,据此,基本的字段应该有:

  1. encType 加密方式,如aes
  2. signType 签名方式,如MD5
  3. signData 签名结果
  4. busiName 请求的业务接口名
  5. busiData 业务数据(这个数据是经过encType指定的算法加密过后的密文,并非明文)

通常还有防重放的要求,增加如下两个字段:

  1. timeStamp 时间戳
  2. nonce 随机数

如果是一对一的接口,以上字段就够用了;如果是一对多(多个客户端),还需要增加clientId来区分每个客户端。一个请求报文的实例如下:

{
    "encType":"aes",
    "signType":"md5",
    "signData":"03b588f517cd3f9b3e702022b4195b52",
    "busiName":"user.info",
    "busiData":"6M1133yyTothav0APxDAd+C4TFkDektkLgFcCjlQx11=",
    "timeStamp":"1506391864652",
    "nonce":"02569838",
    "clientId":"holic_01"
}

2.响应报文

响应报文的变化主要有一是增加了处理结果编码和处理结果描述,二是去掉了防重放的nonce字段,基本字段应包含如下:

  1. resultCode 返回码
  2. resultMsg 返回状态描述
  3. encType 加密方式
  4. signType 签名方式
  5. signData 签名结果
  6. busiName 请求的业务接口名
  7. busiData 业务数据
  8. 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内已经被使用了,那么这个请求就可以判断为重放请求,直接不处理。通过重放验证后,再验证签名:根据和客户端约定的规则对入参进行签名,签名一致则进行后续操作;不一致说明中途被篡改,不予处理。 下一篇文章会对参数的处理进行比较详细的说明,本篇到此结束。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值