使用场景
简单的用户认证(不需要账号密码)
作用
1. 身份验证
2. 防止参数被篡改
3. 防止请求重放
实现思路
1. 使用MD5对请求参数和secretKey拼接的字符串进行加密获得客户端签名clientSign
2. 获取一个随机数nonce
3. 获取一个时间戳timestamp
4. 将请求参数body,accessKey,sign,nonce和timestamp放入请求头中,然后发送请求
- 使用MD5对请求参数和secretKey拼接的字符串进行加密是为了验证身份和防止请求参数被篡改
- 随机数nonce和时间戳timestamp:请求被服务端接受后nonce会被存入内存中(设置为5分钟后自动删除),timestamp用于判断该请求是否为五分钟之内发送的请求,防止请求在五分钟之后重放。
- 每次请求到达服务端时,服务器会先判断该请求是否是5分钟之内发的请求,如果不是则说明该请求为重放请求,则执行拒绝请求。
- 如果是5分钟之内发的请求,则服务器会查看每个请求的nonce在内存中是否存在,假如已经存在,则判断该请求为重放,拒绝该请求,假如不存在,则将nonce存入内存。
校验思路
1. 根据accessKey查询数据库获得secretKey
2. 通过secretKey和body获得服务端签名serverSign
3. 比较clientSign和serverSign是否相同
4. 查看时间戳timestamp和当前时间之差是否在五分钟之内
5. 查看内存中是否有随机数nonce