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

How to restrict API endpoint access to certain clients?

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

我看了一大堆文档,但我似乎无法回答这个问题:

如何限制我的 API 以便只有我的 iOS 客户端可以注册用户/让他们登录?

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

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

没有真正安全的方法来保证请求来自特定设备。正如@dukebody 所提到的,检查 headers 似乎是最好的方法,但对于大多数用户来说,应该将其视为 "good enough" 解决方案。

我也想问你为什么要这样做。 API 通常不应局限于某些设备,因为这会降低它们的可扩展性。此外,REST/HTTP 服务应该 return 无论客户端设备如何,结果都是一样的;否则,在处理客户端和服务之间的缓存和代理时,你会很头疼。

如果您尝试专门为 iOS 格式化内容,您最好添加一个特定的参数,如 ?format=ios,而不检查 headers,然后只需确保您的 iOS 客户端使用该参数。这将更符合 REST 的精神,并使事情更容易缓存和测试。

我也遇到这个issue.I想提供一些我的想法。

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

另一方面,一些像 CSRF 这样的恶意攻击,你也应该为你提供一些额外的保护 API 以防止请求从不受信任的方式发送。

我们考虑了几种机制。

  1. 使用 HTTP header
    这是不受信任的,很容易破解。

  2. 使用一个静态随机生成的API密钥
    非常常见且 easy-implementation 的方式。服务器生成一个静态随机字符串作为key,客户端发送请求时必须携带。
    如果你必须支持 web,如果你只支持应用程序客户端并限制你的 API 与 HTTPs 的连接,这将被 web console.But 泄漏。这应该是足够安全的。

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

你可以尽最大努力让它更难破解,但它永远不会 100% 绝对安全。
黑客仍然可以对您的应用进行逆向工程以查看加密的工作原理。
你所能做的就是让它变得更难。

这是我的建议,希望对您有所启发。
如果您有任何其他更好的解决方案或发现我的建议中的任何错误,请告诉我。