我有一个简单的REST JSON API,可以让其他网站/应用访问我网站的某些数据库(通过PHP网关)。基本上该服务的工作方式如下:调用example.com/fruit/orange,服务器返回有关橙色的JSON信息。问题在于:我只想要允许访问此服务的网站。使用简单的API密钥系统,任何网站都可以通过从授权网站(可能)客户端代码复制密钥来快速获得密钥。我看过OAuth,但对于我正在做的事情似乎有点复杂。溶液
答案 0 :(得分:28)
您应该使用OAuth。
实际上有两个OAuth规范,即3脚版本和2脚版本。 3脚版本是最受关注的版本,并且不是您想要使用的版本。
好消息是,两足版本完全符合您的要求,它允许应用程序通过共享密钥授予对另一个的访问权限(非常类似于Amazon的Web服务模型,您将使用HMAC-SHA1签名方法)或通过公钥/私钥系统(使用签名方法:RSA-SHA1)。坏消息是,它还没有像三足版本那样得到很好的支持,所以你可能需要做的工作比你现在可能要做的多一点。
基本上,两条腿OAuth只是指定了一种方式来“签名”(计算哈希)几个字段,包括当前日期,一个名为“nonce”的随机数,以及请求的参数。这使得非常难以模拟对您的Web服务的请求。
OAuth正在缓慢但肯定地成为这种事情的公认标准 - 如果您接受它,那么从长远来看,您将是最好的,因为人们可以利用各种可用的库来实现这一目标。
它比你最初想要进入的更精细 - 但好消息是很多人花了很多时间在你身上,所以你知道你没有忘记任何事情。一个很好的例子是,最近Twitter发现社区目前正在努力关闭的OAuth安全性存在差距。如果你发明了自己的系统,那么你必须自己弄清楚所有这些。
祝你好运!克里斯
答案 1 :(得分: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/
答案 2 :(得分:4)
如果某人的客户端代码遭到入侵,他们应该获得一个新密钥。如果暴露他们的代码,你就无能为力。
但是,您可以更严格地要求在您的系统中为给定密钥注册授权服务器的IP地址。这增加了一个额外的步骤,可能有点矫枉过正。
我不确定你使用“简单的API密钥”是什么意思,但你应该使用某种具有私钥的身份验证(只有客户端和服务器知道),然后执行某种校验和算法数据,以确保客户确实是你认为的,并确保数据在传输过程中没有被修改。 Amazon AWS是如何做到这一点的一个很好的例子。
我认为保证代码没有在客户端受到损害可能有点严格。我认为将责任放在客户身上是为了保护自己的数据是合理的。当然,这假设攻击者只能弄乱该客户的帐户。
也许您可以记录特定帐户的IP请求来源,如果新的IP出现,请标记该帐户,向客户端发送电子邮件,并要求他们授权该IP。我不知道也许这样的事情可行。
答案 3 :(得分:2)
基本上你有两个选择,要么通过IP限制访问,要么有一个API密钥,两个选项都有正面和负面。
知识产权限制
这可以是限制访问您服务的便捷方式。您可以准确定义允许哪些第三方服务访问您的服务,而无需强制它们实施任何特殊身份验证功能。但是,这种方法的问题是,如果第三方服务完全是用JavaScript编写的,那么传入请求的IP将不是第三方服务的服务器IP,而是用户的IP,因为请求是由用户的浏览器而不是服务器。因此,使用IP限制将无法编写客户端驱动的应用程序,并强制所有请求通过具有适当访问权限的服务器。请记住,IP地址也可能是欺骗性的。
API密钥
API密钥的优点是您不必维护已知IP列表,您必须维护API密钥列表,但更容易自动化其维护。基本上这是如何工作的,你有两个键,例如用户ID和密码。对服务的每个方法请求都应提供一个身份验证哈希,其中包含请求参数,用户ID和这些值的哈希值(其中,密码密码用作哈希盐)。这样您就可以进行身份验证和限制访问。问题是,再一次,如果第三方服务是作为客户端驱动的(例如JavaScript或ActionScript)编写的,那么任何人都可以从代码中解析出用户ID和秘密盐值。
基本上,如果您想确保只允许您专门定义的少数服务访问您的服务,那么您只能使用IP限制,因此强制它们通过其服务器路由所有请求。如果您使用API密钥,则无法强制执行此操作。
答案 4 :(得分:0)
在连接之前,所有IP安全产品似乎都会给用户带来巨大的错误。 Symbian 60s拥有最强大的功能,可以在多个用户(应用Opera Handler UI 6.5,Opera Mini v8和10)以及编码的用户界面+完全填充的网络集中保留无人,可靠和安全的信号 - 起来。当最终获得可发现的更快链接方法的方法时,为什么要限制其他特征。保持更明确的帐户,正确监控该真实账户 - 如果他们正在履行支付账单并了解用户是否有未到期的维持平衡将创建更快的互联网信号链接流行/签名的移动行业。为什么在让他们访问网站之前制作硬安全功能,每月访问他们的帐户可能会清除所有连接问题?所有移动用户都没有能力连接到网络。如果他们有未支付的账单。为什么不在One'中提供一个' ALL - 注册/应用程序帐户,已编程固定的操作系统,(可能是电子邮件帐户),而不是具有“监控功能”。如果他们是否支付(密码问题关注 - 应该给予其他部门)。如果不是'完全关闭他们的帐户和他们的其他链接功能。他们每个人都有自己的兴趣,如果你因为未付账单而锁定/关闭他们,这可能会导致他们重新订阅和惩戒他们以成为更负责任的用户,并且如果没有维护,甚至会过期。每月监控或访问已识别的真实帐户'与网络提供商合作可以产生更高的隐私,而不是总是要求用户提供名称'和'密码','位置','权限'查看他们的数据服务。 IP已经标记了他们的第一个身份或者找到了用户的位置'所以,将它放在浏览器预搜索上似乎是不合理的,为什么不使用'获取数据'或者'处理数据。'