为开发者分配AccessKey(开发者标识,确保唯一) SecretKey(用于接口加密,确保不易被穷举,生成算法不易被猜测)
虽然解决了请求参数篡改的问题,但是存在重复请求的可能。
nonce指唯一的随机字符串,用来标识每个签名的请求。通过为每个请求提供唯一的标识,服务器可以记录标识防止标识被多次使用。
但是记录每一个标识显得代价很大。可以使用timestamp优化nonce的存储,允许10分钟之内的请求进入。
首先,检查timestamp是否在10分钟之内,超过时间则拒绝。如果在10分钟以内则继续检查nonce是否存在,若存在则拒绝,否则记录当前的nonce然后删除过期的nonce,并认为当前请求合法。(因为防止了篡改所以timestamp和nonce无法更改。)
请求接口 http://api.test.cn/test?name=jo&home=word
客服端
timestamp=now&nonce=random
Accesskey=accesskey&home=word&name=jo
Accesskey=accesskey&home=word&name=jo×tamp=now&nonce=random&SecretKey=secretkey
http://api.test.cn/test?name=jo&home=word×tamp=now&nonce=random&sign=signstring
服务端
Accesskey=accesskey&home=word&name=jo
字符串,再拼接一次Accesskey=accesskey&home=word&name=jo×tamp=now&nonce=random&SecretKey=secretkey
再对其进行MD5得到字符串A和上面相同,把AccessKey换成Token再把SecretKey换成AppKey。