在谈这个问题之前,我们先来说说在WebAPI中保障接口请求合法性的常见办法:
API Key + API Secret
cookie-session认证
OAuth
JWT
当然还有很多其它的,比如 openid connect (OAuth 2.0协议之上的简单身份层),Basic Auth ,Digest Auth 不一一例举了
1、API Key + API Secret
Resource + API Key + API Secret 匹配正确后,才可以访问Resource,通常还会配合时间戳来进行时效控制。这种鉴权方式有以下特点:
1)API Key / API Secret这种模式本质不是RBAC,而是做的ACL访问权限控制用的。
2)服务器负责为每个客户端生成一对 key/secret ( key/secret 没有任何关系,不能相互推算),保存,并告知客户端。
3)一般是把所有的请求参数(API Key也放在请求参数内)排序后和API Secret做hash生成一个签名sign参数,服务器后台只需要按照规则做一次签名计算,然后和请求的签名做比较,如果相等验证通过,不相等就不通过。
4)为避免重放攻击,可加上 timestamp 参数,指明客户端调用的时间。服务端在验证请求时若 timestamp 超过允许误差则直接返回错误。
5)一般来说每一个api用户都需要分配一对API Key / API Secret的,比如你有几百万的用户,那么需要几百万个密钥对的,数据量不大时一般存在xml中,数据量大时可以存在mysql表中。