我有一个网站和一个API。该网站允许匿名人员浏览目录,但您必须登录才能发布内容。
我构建了一个公开相同功能的API。 API由我们正在开发的移动应用程序使用,但我们也将允许其他开发人员使用API(即,它是公开记录的)。整个API目前需要OAuth(2.0)身份验证。为防止滥用行为,我们对每个OAuth客户端ID /用户ID组合使用了速率限制。
现在移动应用程序的新要求已经下降:该应用程序应该允许匿名用户浏览我们的目录。我不确定如何实现这一点,而不会打开我们的API滥用。
第一个问题是允许匿名访问。如果我们仍然希望OAuth保护整个API,那么我们的移动应用必须使用客户端凭据授予类型(发布客户端ID和密钥)。但是我们必须将app-id和secret保存在应用程序本身中。这不安全,因为它可以很容易地进行逆向工程。
或者,我们可以使用动态客户端注册。一旦安装了应用程序,它就会向(未记录的)API注册,以便为自己创建OAuth客户端。问题在于,如何保护客户端注册端点?又一个秘密钥匙?此外,这会导致大量OAuth客户注册。
或者,我们可以一起从公共端点删除OAuth(即浏览目录),只需要OAuth发布内容或管理帐户。但是,我如何保护API免受滥用呢?没有OAuth,我无法根据客户端ID进行速率限制。
我不确定基于IP地址的速率限制是否有效。我们期待许多移动应用程序用户,我担心蹩脚(摩洛哥)移动电信提供商正在为少数IP地址背后的大量电话用户提供NAT。这很快就会耗尽我们设定的任何限速。
这是对的吗?或者我可以安全地限制移动用户的IP地址吗?
我还可以在OAuth的同时实现不同的身份验证机制。允许我们的移动电话应用程序访问API的东西,可以区分(和限制)不同的电话/用户,但这对于从我们的移动应用程序二进制文件中提取共享密钥的人来说是安全的。
有关如何允许匿名访问我的API但仍然有效率限制的任何建议吗?
答案 0 :(得分: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"
}
受信任的机构会交换开发人员提供的信息来生成“ software_statement”。其中包含对于本机应用程序的所有安装而言恒定的信息。
在用户设备上安装应用程序后,该应用程序与授权服务器联系以进行动态注册。该应用将以下内容发布到授权服务器
{
"redirect_uri" : "OPTIONAL_FOR_CLIENT_CREDENTIALS",
"scope": "SPACE SEPARATED SCOPES",
"software_statement": "MANDATORY"
}
授权服务器验证“ software_statement”中存在的信息,生成并返回特定于特定软件安装的“ client_id”和“ client_secret”。
客户端使用新接收到的“ client_id”和“ client_secret”在令牌端点上调用“ POST”方法,并接收“ access_token”。
客户端使用“ access_token”访问“ protected_resource”。
我的回答来源是曼宁(Manning)出版的“ oauth 2 in action”。