如何限制对某些客户端的API端点访问?

时间:2015-09-11 22:33:40

标签: api rest oauth-2.0 django-rest-framework

我正在使用Django Rest Framework构建API。

我看了很多文档,但我似乎无法回答这个问题:

如何限制我的API,以便我的iOS客户端只能注册用户/登录?

我了解我可以将OAuth2或令牌身份验证用于其他端点。但是对于未经身份验证的请求,有没有办法限制它们?

3 个答案:

答案 0 :(得分:3)

没有真正安全的方法来保证来自特定设备的请求。正如@dukebody所提到的,检查标题似乎是最好的方法,但对大多数用户来说应该被视为“足够好”的解决方案。

我也会问你为什么要这样做。 API通常不应限于某些设备,因为它使它们不易扩展。此外,无论客户端设备如何,REST / HTTP服务都应返回相同的结果;否则,在处理客户端和服务之间的缓存和代理时会引起麻烦。

如果您尝试专门为iOS设置内容格式,最好在不检查标题的情况下添加特定参数,例如?format = ios,然后确保您的iOS客户端使用该参数。这将更符合REST的精神,使事情更容易缓存和测试。

答案 1 :(得分:1)

我也遇到了这个问题。我想提供一些想法。

我的团队需要支持一些操作繁重的API,并且这将对未经身份验证的用户开放,这是由业务逻辑设计的。
这就是为什么我们需要将api请求限制为我们的应用程序客户端。
API调用是无状态的,与缓存和代理无关。

另一方面,对于CSRF之类的恶意攻击,您还应该在API上提供一些额外的保护,以防止请求以不受信任的方式发送。

我们考虑了几种机制。

  1. 使用HTTP标头
    这是不可信的,并且很容易破解。

  2. 使用一个静态随机生成的API密钥
    非常普遍且易于实现的方式。服务器生成了一个静态随机字符串作为密钥,客户端在发送请求时必须携带该字符串。
    如果必须支持Web,则Web控制台可能会泄漏此信息。但是,如果仅支持应用程序客户端并使用HTTP限制API连接。这应该足够安全。

  3. 具有AES加密算法的动态更改API密钥
    为了防止MITM或静态API密钥泄漏,我建议使用AES加密算法并对当前时间戳进行加密。
    服务器收到后,解密并检查请求是否有效。
    您还可以添加一些字符串作为盐,以使机制更难以受到暴力攻击。

您可以尽最大努力使它更难以破解,但这绝对不是绝对100%安全的。
黑客仍然可以对您的应用程序进行反向工程,以查看加密的工作原理。
您所能做的就是加大难度。

这是我的建议,希望它能启发您。
如果您还有其他更好的解决方案,或者在我的建议中发现了一些错误,请告诉我。

答案 2 :(得分:0)

将视图限制为iOS客户端的用户代理,检查标头。见https://stackoverflow.com/a/4617648/356729