【发布时间】:2020-03-09 16:41:00
【问题描述】:
我正在使用 Django Rest 框架构建一个 API。
我查看了一大堆文档,但我似乎无法回答这个问题:
如何限制我的 API 以使只有我的 iOS 客户端才能注册用户/登录?
我了解我可以将 OAuth2 或令牌身份验证用于其他端点。但是对于未经身份验证的请求,有没有办法限制它们?
【问题讨论】:
标签: api rest oauth-2.0 django-rest-framework
我正在使用 Django Rest 框架构建一个 API。
我查看了一大堆文档,但我似乎无法回答这个问题:
如何限制我的 API 以使只有我的 iOS 客户端才能注册用户/登录?
我了解我可以将 OAuth2 或令牌身份验证用于其他端点。但是对于未经身份验证的请求,有没有办法限制它们?
【问题讨论】:
标签: api rest oauth-2.0 django-rest-framework
没有真正安全的方法来保证请求来自特定设备。正如@dukebody 所提到的,检查标头似乎是最好的方法,但对于大多数用户来说应该被视为“足够好”的解决方案。
我还想问你为什么要这样做。 API 通常不应仅限于某些设备,因为这会使它们的可扩展性降低。此外,无论客户端设备如何,REST/HTTP 服务都应该返回相同的结果;否则,在处理客户端和您的服务之间的缓存和代理时,您会很头疼。
如果您尝试专门为 iOS 格式化内容,您最好添加一个特定参数,例如 ?format=ios 而不检查标题,然后确保您的 iOS 客户端使用该参数。这将更符合 REST 的精神,并使事情更容易缓存和测试。
【讨论】:
我也遇到了这个问题。我想提供一些我的想法。
我的团队需要支持一些操作繁重的 API,并且它将向未经身份验证的用户开放,这是由业务逻辑设计的。
这就是为什么我们需要限制对我们的应用客户端的 API 请求。
API 调用是无状态的,与缓存和代理无关。
另一方面,像 CSRF 这样的恶意攻击,你还应该对你的 API 提供一些额外的保护,以防止请求以不受信任的方式发送。
我们考虑了几种机制。
使用 HTTP 标头
这是不可信的,很容易破解。
使用一个静态随机生成的 API 密钥
非常常见且易于实现的方式。服务器生成一个静态随机字符串作为key,客户端发送请求时必须携带。
如果您必须支持 Web,这将被 Web 控制台泄漏。但如果您只支持应用程序客户端并限制您的 API 连接与 HTTPs。这应该足够安全。
使用 AES 加密算法动态更改 API 密钥
为了防止 MITM 或静态 API 密钥泄露,我建议使用 AES 加密算法并加密当前时间戳。
当服务器接收到时,解密并检查请求是否有效。
您还可以附加一些字符串作为盐,以使该机制更难暴力攻击。
您可以尽最大努力使其更难破解,但它永远不会 100% 安全。
黑客仍然可以对您的应用进行逆向工程,以了解加密的工作原理。
你所能做的就是让它变得更难。
这是我的建议,希望它能启发你。
如果您有任何其他更好的解决方案或在我的建议中发现一些错误,请告诉我。
【讨论】:
将视图限制为 iOS 客户端的用户代理,检查标头。见https://stackoverflow.com/a/4617648/356729
【讨论】: