我一直在寻找一种方法来保护我的RESTful API。这似乎很简单,但似乎并不那么简单。首先,我正在编写一个连接到Play Framework服务器的iOS应用程序。这些都与Google,Facebook,Twitter或LinkedIn无关(令我感到震惊)。哦,我目前的计划不要求自定义应用程序使用我的API,它只是我的应用程序。
基本身份验证
看似简单的是管理cookie会话的/ auth方法的基本用户/传递。这可能会引起一些呻吟声,因为它太简单或太弱,但主要是它将身份移动到快速验证的会话密钥。我最初的设置是每天使会话过期,但这导致iOS应用程序每天强制登录,这证明是一种烦恼。
的OAuth
我在iOS主板上发布了一个问题,并对OAuth采取了直截了当的指示。我对OAuth的研究开始了,但是神圣的事情很复杂,似乎没有任何服务器端的例子......只是很多人抱怨它有多么令人沮丧。所有客户端示例都显示连接到Google,Facebook,Twitter和LinkedIn。哦,欢乐!
在观看了Eran Hammer对OAuth1和OAuth2的咆哮后,继续看起来毫无结果,他的OZ想法(看起来很干净)只是在node.js的早期阶段。
问题
所以,我对广泛的StackOverflow社区的问题是......你如何保护REST API?
答案 0 :(得分:7)
我建议考虑最大的参与者使用的方法,即亚马逊网络服务或Windows Azure - HMAC。虽然它在实现上并不舒服,但你可以看到它是值得信赖的技术。
一般的想法是使用密钥在iOS中签署请求的部分(即标题),并尝试在Play应用程序上重新计算它,以验证请求是否真实且未被操纵。如果它不会失败,你可以(几乎)确定,这是从使用有效密钥的某人发送的。
查看Windows' document以获取概念(我认为对于常见任务,您可以使用较少数量的元素进行签名)。
还有其他interesting post(基于AWS身份验证)可以更好地描述整个过程。
修改强>
当然你应该意识到iOS中的身份验证和保护API请求是不同的事情,即使你的会话每15分钟到期一次,你也不能确定某人不会偷听它然后将能够从外部发送虚假请求。签署每个请求应该将风险降至最低。
另一方面,如果您准备明确规则来签署请求并编写简短文档(我甚至建议您自己推荐),您可以将其交付给其他开发人员,他将能够在(几乎)任何支持SHA256的平台上实现它,因此您可以准备好使用第3方应用程序的API - 如果您决定将来发布它。
答案 1 :(得分:0)
由于Play Framework是Java版,因此您可以使用Apache Shiro
我还没有使用它......(我计划这样做)所以我不知道它是不是最好的选择。
答案 2 :(得分:0)
只需做一些简单的事情,通过HTTPS在自定义标头中发送授权码/密码。
答案 3 :(得分:0)
因此,基本身份验证方法的唯一问题是用户必须每天登录?为什么不向用户提供在设备上保存用户名/密码的选项?这样他就可以在安全性和便利性之间做出选择。