API签名认证
本质:
1 签发签名
2 使用签名(校验签名)
为什么需要?
1 保证安全性,不能随便一个人调用
怎么实现?
通过 http request header 头传递参数。
参数 1:accessKey:调用的标识 userA, userB(复杂、无序、无规律)
参数 2:secretKey:密钥(复杂、无序、无规律)该参数不能放到请求头中
(类似用户名和密码,区别:ak、sk 是无状态的)
大家可以自己写代码来给用户生成 ak、sk
千万不能把密钥直接在服务器之间传递,有可能会被拦截
参数 3:用户请求参数
参数 4:sign
加密方式:对称加密、非对称加密、md5 签名(不可解密)
用户参数 + 密钥 => 签名生成算法(MD5、HMac、Sha1) => 不可解密的值
abc + abcdefgh => sajdgdioajdgioa
怎么知道这个签名对不对?
服务端用一模一样的参数和算法去生成签名,只要和用户传的的一致,就表示一致。
怎么防重放?
参数 5:加 nonce 随机数,只能用一次
服务端要保存用过的随机数
参数 6:加 timestamp 时间戳,校验时间戳是否过期。
API 签名认证是一个很灵活的设计,具体要有哪些参数、参数名如何一定要根据场景来。(比如 userId、appId、version、固定值等)
思考:难道开发者每次调用接口都要自己写签名算法?