上一章节讲到了,为了防止接口重放,我们给每一个请求加上一个时间戳,但是这样并没有完全地解决防重放问题,有效期内还是可以多次调用。

所以为了解决这一问题呢,我们可以在每一个请求上,再加上一个随机数nonce,客户端每个请求的nonce我都记录下来,那么下一次再次请求的时候,就先根据nonce查一下,有没有请求过,请求过就丢弃,没有就正常处理。

比如这个接口:

curl -v -H 'X-TimeStamp: 1680503150' -H 'X-Nonce: wX5krzyVHuaYS8Ta' 'http://127.0.0.1:8080/testGet?p=testp&ab=123&x=456'
1

我们在Header里,多传了一个X-Nonce,值为wX5krzyVHuaYS8Ta(随机生成的),为了防止别人篡改呢,也需要将其作为签名的数据,比如固定参数名为nonce,放置在timestamp后面,也不参与排序,那么待签名数据就变成了:

ab=123&p=testp&x=456&path=/testGet&timestamp=1680503150&nonce=wX5krzyVHuaYS8Ta
1

# 注意事项

  • 如果客户端超时重传,需要产生新的Nonce,要不可能会被拒
  • Nonce需要配合Timestamp一起,比如将Nonce存放到Redis,给Nonce设置一个过期时间,这个过期时间可以为Timestamp的有效期。
  • 如果条件允许,可以将Nonce缓存独立出来,避免故障引起服务不可用。