简单,安全的API身份验证系统

35 api rest json key

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

Chr*_*ris 28

你应该使用OAuth.

实际上有两个OAuth规范,3脚版本和2脚版本.三脚版本是最受关注的版本,并不是您想要使用的版本.

好消息是2脚版本完全符合您的要求,它允许应用程序通过共享密钥授予对另一个的访问权限(非常类似于Amazon的Web服务模型,您将使用HMAC-SHA1签名方法)或通过公钥/私钥系统(使用签名方法:RSA-SHA1).坏消息是,它还没有像三足版本那样得到很好的支持,所以你可能不得不做比现在更多的工作.

基本上,两条腿OAuth只是指定了一种方式来"签名"(计算哈希)几个字段,包括当前日期,一个名为"nonce"的随机数,以及您的请求的参数.这使得很难模拟对您的Web服务的请求.

OAuth正在缓慢但肯定地成为这种事情的公认标准 - 从长远来看,如果你接受它,你将是最好的,因为人们可以利用各种可用的库来实现这一目标.

它比你最初想要的更精细 - 但好消息是很多人花了很多时间在你身上,所以你知道你没有忘记任何事情.一个很好的例子是,最近Twitter发现社区目前正在努力关闭的OAuth安全性存在差距.如果你发明了自己的系统,那么你必须自己弄清楚所有这些东西.

祝好运!

克里斯


Dan*_*son 21

OAuth不是解决方案.
OAuth是指您拥有最终用户并希望第三方应用程序无法处理最终用户密码.何时使用OAuth: http: //blog.apigee.com/detail/when_to_use_oauth/

去寻找简单的api-key.
如果需要更安全的解决方案,请采取其他措施.

以下是一些更多信息,http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/


Kek*_*koa 4

如果某人的客户端代码被泄露,他们应该获得一个新密钥。如果他们的代码被公开,你就无能为力。

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

我不确定你所说的使用“简单 API 密钥”是什么意思,但你应该使用某种具有私钥的身份验证(仅客户端和服务器知道),然后对数据执行某种校验和算法确保客户端确实是您认为的那个人,并且数据在传输过程中没有被修改。 亚马逊 AWS就是一个很好的例子来说明如何做到这一点。

我认为保证客户端的代码不会受到损害可能有点严格。我认为让客户对自己数据的安全负责是合理的。当然,这假设攻击者只能搞乱该客户的帐户。

也许您可以记录特定帐户的 ip 请求,如果出现新的 ip,则标记该帐户,向客户端发送电子邮件,并要求他们授权该 ip。我不知道也许类似的东西会起作用。