我已经创建了一个Web应用程序,现在我想构建一些REST API,使其可由第三方开发人员编程。然后,我想用一些流行的语言(JavaScript,PHP,Ruby等)构建一些客户端库,以便使用我的服务使devs变得舒适,避免它们手动解析每个请求的JSON响应。
我之前从未构建过API基础架构,所以我有以下问题。 我想跟踪第三方开发人员调用的API方法的用法。在使用API之前,每个开发人员都必须进行注册,因此我希望将每个请求与注册的开发人员相关联(因此,设置一些特定的使用限制等)。
我想为每个开发人员创建一个唯一的api密钥,他可以将其用于所有应用程序,以验证请求。但后来我意识到如果他决定使用我的javascript包装器,那么恶意用户可以查看客户端应用程序页面的源代码并获取他的api密钥。 因此,我决定为每个应用程序创建一个唯一的api密钥,与托管客户端应用程序的域相关联。因此,即使用户抓住别人的密钥,它也会在最初注册的域之外无用。 但后来我想:移动应用程序怎么样?如果电话不是来自网站,会发生什么?如果没有域或IP地址不是静态的,我如何通过其域验证密钥?
任何提示?
谢谢!
答案 0 :(得分:1)
马哥。 不确定您是否仍在处理此问题,但以防万一:如果您的主要目标是跟踪来自不同网站的API的使用情况,那么您为每位开发人员分配一个唯一的API密钥是正确的。但是,对于JavaScript,请求不会来自该开发人员;它将来自最终用户的计算机(假设您使用JSONP来绕过JavaScript中的同一域策略)。您可以使用HTTP_REFERER强制执行域限制(即您从1.2.3.4.comcast.net获得请求,但其HTTP_REFERER是www.developer.com)但显然确定的恶意用户可能会欺骗该REFERER。
另一种选择可能是避免使用JSONP并使JavaScript库附带本地代理。这样,AJAX调用将从用户的浏览器转到开发人员的服务器(通过会话cookie / crumb验证),然后开发人员的服务器联系您的服务器(可以很容易地限制IP和/或使用强身份验证)。
希望有所帮助。