简单,安全的APIauthentication系统

我有一个简单的REST JSON API用于其他网站/应用程序访问我的网站的一些数据库(通过PHP网关)。 基本上这样的服务是这样的:call example.com/fruit/orange,服务器返回关于橙色的JSON信息。 这是问题:我只想要我允许访问这个服务的网站。 使用简单的API密钥系统,任何网站都可以通过从授权网站(潜在的)客户端代码复制密钥来快速获得密钥。 我已经看过OAuth,但是对于我所做的事情似乎有点复杂。 解决scheme?

你应该使用OAuth。

实际上有两种OAuth规范,三种版本和两种版本。 三腿版本是最受关注的版本, 并不是您想要使用的版本。

好消息是,2-legged版本正是你想要的,它允许应用程序通过共享密钥(与Amazon的Web Service模型非常相似,您将使用HMAC-SHA1签名方法)授予对另一个的访问权限。或通过公钥/私钥系统(使用签名方法:RSA-SHA1)。 坏消息是,它还没有像三脚版本那样得到很好的支持,所以你可能需要做更多的工作,否则你现在可能不得不做更多的工作。

基本上,双腿OAuth只是指定一种方法来“签名”(计算散列)几个字段,其中包括当前date,一个称为“随机数”的随机数和您的请求的参数。 这使得很难模拟对您的Web服务的请求。

OAuth正在缓慢而稳固地成为这种事情的公认标准 – 如果你接受这个标准,你将会从长远来看是最好的,因为人们可以利用各种可用的库来做到这一点。

这比你最初想要的更精细 – 但好消息是,很多人花了很多时间,所以你知道你没有忘记任何东西。 一个很好的例子就是最近Twitter发现了社区目前正在closures的OAuth安全漏洞。 如果你发明了自己的系统,你必须自己弄清楚所有这些东西。

祝你好运!

克里斯

OAuth不是这里的解决scheme
OAuth是当你有最终用户,并希望第三方应用程序不处理最终用户的密码。 何时使用OAuth: http : //blog.apigee.com/detail/when_to_use_oauth/

去简单的API键
如果需要更安全的解决scheme,则采取其他措施。

这里是一些更多的信息, http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/

如果某人的客户端代码被盗用,他们应该得到一个新的密钥。 如果他们的代码被暴露了,那么你可以做的事情就不多了。

但是,您可以通过要求授权服务器的IP地址在您的系统中为给定的密钥进行注册而更加严格。 这增加了一个额外的步骤,可能是矫枉过正。

我不确定你的意思是使用“简单的API密钥”,但你应该使用某种具有私钥的authentication(只有客户端和服务器已知),然后对数据执行某种校验和algorithm确保客户确实是您认为的客户,并且数据在传输过程中未被修改。 Amazon AWS就是一个很好的例子。

我认为可能有点严格,以确保代码没有在客户端受到威胁。 我认为把责任放在你的客户端上是为了保护他们自己的数据是合理的。 当然,这假设攻击者只能搞砸客户的账户。

也许你可以保留一个特定帐户的ip请求日志,如果有新的ip出现,可以标记该帐户,发送邮件给客户端,并要求他们授权该ip。 我不知道也许这样的事情可以工作。

基本上你有两个select,要么限制IP访问,要么有一个API密钥,这两个选项都有其正面和负面的方面。

IP限制
这可以是一个方便的方式来限制访问您的服务。 您可以准确定义哪些第三方服务将被允许访问您的服务,而不强制执行任何特殊的身份validationfunction。 然而,这种方法的问题是,如果第三方服务完全用JavaScript编写,那么传入请求的IP将不是第三方服务的服务器IP,而是用户的IP,由用户的浏览器而不是服务器。 因此,使用IP限制将使得编写客户端驱动的应用程序成为不可能,并且强制所有请求通过具有正确访问权限的服务器。 请记住,IP地址也可能被欺骗。

API密钥
API密钥的优点是您不必维护已知IP的列表,您必须保留一个API密钥列表,但是维护自动化更容易。 基本上这是如何工作的是,你有两个键,例如用户ID和密码。 每个方法对你的服务的请求应该提供一个由请求参数,用户ID和这些值的散列组成的authentication哈希(其中密码用作哈希盐)。 这样你就可以authentication和限制访问。 问题在于,如果第三方服务被写为客户端驱动的(例如JavaScript或ActionScript),那么任何人都可以从代码中parsing出用户ID和秘密salt值。

基本上,如果你想确保只有less数你特别定义的服务可以访问你的服务,那么你唯一的select是使用IP限制,从而强制他们通过服务器路由所有的请求。 如果您使用API​​密钥,则无法执行此操作。

知识产权的安全生产似乎产生了一个巨大的问题,在用户连接之前。 Symbian 60具有在多个用户(应用Opera Handler UI 6.5,Opera Mini v8和10)以及编码的UI和完全填充的networking设置中留下一个未被感染,可靠和安全的信号的最大能力。 为什么限制其他function时,最终获得更快的链接方法的发现方法。 保持一个更明确的账户,对“真实账户”进行适当的监控 – 如果他们正在追踪支付账单的合规性,并且知道用户是否有未到期的维持平衡,将会创build一个更快速的互联网信号链接到stream行/签名移动行业。 为什么在使用安全function之前,每月访问他们的帐户可能会消除所有的连接问题? 所有的手机用户如果没有支付账单,就没有能力“连通”。 为什么不提供“ALL IN ONE” – 注册/应用程序账号,一个用OS固定的程序(可能是一个电子邮件账号),而不是一个“监控function”到其他部门)。 如果“不”closures他们的帐户和他们的其他链接function。 他们每个人都有自己的兴趣,每天上哪儿都有兴趣,如果因为未付账单而locking/closures了他们,可能会重新订阅并更多地pipe理他们,从而成为更负责任的用户,甚至可能会过期如果没有维护帐户。 通过与networking提供商合作每月监控或访问已识别的“真实账户”,可以产生更高的隐私,而不是总是要求用户的“姓名”和“密码”,“位置”,“权限”来查看他们的数据服务。 IP标记已经是他们的第一个身份,或者“查找用户的位置”,所以把它放在浏览器预search上似乎不太合适,为什么不使用“获取数据”或“处理数据”。