【问题标题】:Protect my public oauth API from abuse, but allow anonymous access from my app?保护我的公共 oauth API 免受滥用,但允许从我的应用程序匿名访问?
【发布时间】: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


【解决方案1】:

由于移动应用安装在设备上,如果您配置了一个密码,那么该密码将适用于移动应用的所有安装。因此,偏离了秘密的目的。

您应该进行动态注册。以下是步骤

  1. 开发人员使用受信任的机构预先配置了以下信息。

 {
 "software_id":"COMMON_VALUE_HERE",
    "software_version": "OPTIONAL_BUILD_VERSION",
    "client_name":"HUMAN_READABLE_CLIENT_NAME",
    "client_uri":"OPTIONAL_FOR_CLIENT_CREDENTIALS",
    "logo_uri":"OPTIONAL_FOR_CLIENT_CREDENTIALS",
    "tos_uri":"OPTIONAL_TERMS_OF_USE"
}
  1. 受信任的机构生成“software_statement”以交换开发人员提供的信息。这包含对于本机应用的所有安装都是不变的信息。

  2. 在用户设备上安装应用后,应用会联系授权服务器进行动态注册。该应用将以下内容发布到授权服务器

{
"redirect_uri" : "OPTIONAL_FOR_CLIENT_CREDENTIALS",
"scope": "SPACE SEPARATED SCOPES",
"software_statement": "MANDATORY"
}
  1. 授权服务器验证“software_statement”中存在的信息,生成并返回特定于特定软件安装的“client_id”和“client_secret”。

  2. 客户端使用新收到的“client_id”和“client_secret”在令牌端点上调用“POST”方法,并收到一个“access_token”。

  3. 客户端使用“access_token”访问“protected_resource”。

我的答案来自 Manning 出版物的“oauth 2 in action”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 2022-01-21
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2012-06-19
    相关资源
    最近更新 更多