今天师兄让我设计地图API Key的实现方法,看了一下google、百度地图的API,大概整理一下流程,因为在网上很难查到相关的资料,菜鸟拿出来和大家分享一下。
1. 实现的前提
l API Key与用户的帐户关联。
² 为了获取API调用者的信息,要确保API调用者在拥有了新浪账户之后才能够申请API Key
l API Key要映射到一个明确的域名与目录,这也就是说,如果一个API调用者想访问API,它要具备两个条件:
² 在进行服务请求的时候,API调用者要指定一个正确的API Key做为请求参数
² 调用者要在与API Key匹配的域名与目录中,假设这个Key是通过URL:http://map.sina.com.cn/samples(包括了域名map.sina.com.cn与目录samples)来申请的。哪么,所有的来自这个URL的API申请都能被通过,而来自其它URL的申请就不能用这个Key。
2. 实现方法
要实现这个技术,首先你要生成并分发这些API Key,之后是你要验证通过这些Key来进行的API调用请求,下面我们来具体分析这两个模型:
l 加密模式
² 通过一个Hash函数来生成一个API Key并分发出去,这里可以采用php的Mhash实现,这个方法是一个单向的方法,只能通过一些数据来生成Key,而不能通过这个Key再还原出来这个数据。在这里,输入的数据就是URL。
² 生成key时加一个TOKEN,这样更加不好逆转。
l 验证模型
² 根据一个主机的调用请求HTTP referer+TOKEN(HTTP referer中含有发出请求的源URL)信息再生成一个Key,然后比较这个Key与用户有请求时写到参数中的哪个Key,如果验证匹配,哪么这个主机的请求将被响应。
3. 局限
用API Key来控制访问有一些局限,不过它能去除大量的非法API调用。
l HTTP referer很容易被伪造
l 虽然从key中很难还原出原来数据(也就是URL),但也不是不可能的。就算我们用了MD5算法,并在Key中加入了TOKEN来增加还原的难度。
4. 优势
通过API Key与URL之间对应关系来限制你的API只能由某个特定的域名也目录来调用,也就是说,你可以指定哪个主机可以访问你的API。除此之外,这个技术还可以帮助你确定谁在用你的API,这样你就可以统计,在某段时间内,你的服务被调用多少次。
5. 数据模型
l 存在的问题?
² 是否加上限制机制?即,针对调用者的使用权限加以控制,在验证API Key的同时,验证KEY值是否过期,是否被强制锁定,是否需要续费等,这样的优势是对使用者的行为时可控的,劣势是每次验证都要访问数据库,降低验证的效率,增强数据库的压力。