如何保护RESTful API

18

我一直在寻找保护我的RESTful API的方法。这似乎很简单,但实际上并不是那么简单。首先,我正在编写一个连接到Play Framework服务器的iOS应用程序。这与Google、Facebook、Twitter或LinkedIn没有任何关系(令人震惊的是)。哦,而且我的当前计划不需要自定义应用程序使用我的API,只是暂时使用我的应用程序。

基本认证

看起来简单的方法是,在/auth方法中使用基本的用户名/密码管理一个cookie会话。这可能会引起一些人的不满,因为它过于简单或者有弱点,但大多数情况下,它可以快速验证身份信息并将其转移到一个会话密钥中。我的最初设置是每天过期会话,但这导致iOS应用程序每天强制登录,证明这是一个烦恼。

OAuth

我在一个iOS论坛上发布了一个问题,并收到了关于OAuth的简单指导。我的OAuth研究开始了,但是他妈的复杂,似乎没有任何服务器端示例...只有很多人抱怨它有多么令人沮丧。所有客户端示例都显示连接到Google、Facebook、Twitter和LinkedIn。太棒了!

在观看Eran Hammer关于OAuth1和OAuth2的愤怒之后,继续下去似乎是徒劳无功的,而他的OZ想法(看起来真的很干净)只在node.js的早期阶段。

问题

那么,我对广大StackOverflow社区的问题是......你如何保护你的REST API?


看看这个:https://dev59.com/NWvXa4cB1Zd3GeqPNdtO - palako
4个回答

7
我建议考虑最大的参与者所使用的方法,例如Amazon Web Services或Windows Azure - HMAC。尽管实现起来不太方便,但正如您所看到的,这是一种可靠的技术。
总体思路是在iOS中使用秘密密钥对请求部分(即标题)进行签名,并尝试在Play应用程序上重新计算以验证请求是否真实且未被篡改。如果它不失败,你可以(几乎)确定它是由使用有效秘密密钥的人发送的。
请查看Windows' document 以了解概念(我认为对于常见任务,您可以使用较少数量的元素进行签名)。
还有另一个有趣的帖子(基于AWS身份验证),它更好地描述了整个过程。 编辑 当然,你应该意识到iOS中的身份验证和保护API请求是不同的事情,即使你每15分钟过期一次会话,你也不能确定某人不会窃听它,然后将能够从外部发送假请求。签署每个请求应该将风险最小化。
另一方面,如果你为签署请求准备了明确的规则,并编写了简短的文档(我建议即使是给自己),你可以将其交给其他开发人员,他们将能够在支持SHA256的任何平台上实现它,因此你将拥有API,可供第三方应用程序使用-如果你决定在未来发布它。

感谢提到 HMAC。在发布此问题之前,我已经阅读了您提到的 AWS 文章。它最终类似于 OAuth 2-legged,但出于某些原因更容易理解。但是...我无法不想知道这与隐藏所有复杂性的 SSL 不同。我只使用 SSL 进行用户名/密码会话是否更好?那样做的缺点是什么,其他人是否最终采用这种方法来避免 OAuth 和 HMAC 带来的复杂性? - darren
这是品味问题,使用SSL需要在Play应用程序之上添加前端HTTP服务器,因为Play 2.x没有本地SSL支持,还需要购买SSL证书并每年更新。 HMAC签名方法更加“独立”,我会选择它,特别是对于具有相对较小API的临时应用程序。实际上,我需要再添加一件事,描述的HMAC提供签署消息,但不加密其正文,因此专用于身份验证,但无法确保完全隐私,请注意如果您将发送敏感数据。 - biesior
我对这个主题很新,虽然我读了链接,但我仍需要澄清(也许其他人也是如此)。在我看来,使用HMAC可以验证客户端应用程序与服务器,但您不会获得任何基于用户的授权。我错了吗?相关:我曾认为OAuth提供身份验证和授权功能。我对此也错了吗? - Michael Repucci

0

由于Play Framework是基于Java的,您可以使用Apache Shiro

我还没有使用过它..(虽然我打算这样做),所以我不知道它是否是最佳选择。


0

只需做一些简单的事情,在HTTPS上通过自定义标头发送授权代码/密码。


2
这也是我一直在想的问题。那么这样做有什么不利之处吗? - darren

0

所以基本身份验证方法的唯一问题是用户每天都必须登录吗?为什么不为用户提供在设备上保存用户名/密码的选项呢?这样他就可以在安全和便利之间进行选择。


这是我迄今为止一直在做的事情,将用户/密码存储在Keychain中以便在后台重放。 - darren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接