【发布时间】:2018-02-17 00:50:46
【问题描述】:
我有一个网站和一个 API。该网站允许匿名用户浏览目录,但您必须登录才能发布内容。
我已经构建了一个公开相同功能的 API。该 API 由我们正在开发的移动应用程序使用,但我们也将允许其他开发人员使用该 API(即它已公开记录)。整个 API 当前需要 OAuth (2.0) 身份验证。为防止滥用,我们对每个 OAuth 客户端 ID/用户 ID 组合使用速率限制。
现在对移动应用提出了一项新要求:该应用应允许匿名用户浏览我们的目录。我不知道如何实现这一点,而不会让我们的 API 被滥用。
匿名 OAuth 访问
第一个问题是允许匿名访问。如果我们仍然希望整个 API 受 OAuth 保护,那么我们的移动应用程序将不得不使用客户端凭据授权类型(发布客户端 ID 和密钥)。但是我们必须将客户端 ID 和密码存储在应用程序本身中。这是不安全的,因为它很容易被逆向工程。
或者,我们可以使用动态客户端注册。安装应用程序后,它会立即向(未记录的)API 注册,以为自己创建 OAuth 客户端。这里的问题是,如何保护客户端注册端点?又是秘钥?此外,这会导致大量 OAuth 客户端注册。
从公共端点移除 OAuth
或者,我们可以一起从公共端点中删除 OAuth(即浏览目录),并且只需要 OAuth 来发布内容或管理帐户。但是我将如何保护 API 免受滥用呢?如果没有 OAuth,我无法根据客户端 ID 进行速率限制。
我不确定基于 IP 地址的速率限制是否有效。我们预计会有很多移动应用程序用户,但我担心糟糕的(摩洛哥)移动电信提供商会在几个 IP 地址后面对大量电话用户进行 NAT。这将很快耗尽我们设置的任何速率限制。
这是正确的吗?或者我可以安全地对移动用户的 IP 地址进行速率限制吗?
替代安全机制
我还可以在 OAuth 旁边实现不同的身份验证机制。允许我们的手机应用访问 API 的东西,它可以区分(和速率限制)不同的手机/用户,但对于人们从我们的移动应用二进制文件中提取共享密钥是安全的。
关于如何允许匿名访问我的 API 但仍然有效地限制速率的任何建议?
【问题讨论】:
-
如果我了解情况;我会使用“服务帐户”进行任何匿名浏览。因此,如果他们是匿名的,请为服务帐户执行 OAuth 授权。您没有提及您的架构或授权服务器,但许多产品都为这些情况提供了解决方案。
-
嗨!我面临着类似的困境(我需要一个主要受 OAuth/OIDC 保护的 API 上的“匿名”端点)。你最终使用了什么解决方案?
标签: api security mobile oauth rate-limiting