使用OAuth2安全地validation移动访问的选项

我们目前正在实施OAuth2以保护我们的新API,并且不确定如何安全地提供所需的function。 我们需要从移动设备允许以下内容:

下载应用程序后,用户可以立即拍照并提交,无需先登录。

虽然我们希望允许匿名用户访问,但用户无需登录或注册以使用某些function,我们不希望允许对API进行未经身份validation的访问。 这通常使用客户端凭证授权流来获取和app访问令牌来完成,但这需要知道客户端密钥。 根据我的阅读,移动设备不被视为可信客户端,不应包含客户端密钥,因此无法自行生成应用程序访问令牌。

我们已经提出了一些选项来完成这个要求,但是想要一些输入:

  1. 将客户端密码嵌入应用程序中。 从安全的角度看似乎并不理想,但也许我们错过了一种明显的方法来保护它? 我们的目标是至少iOS和Android。
  2. 离线生成应用访问令牌并将其嵌入应用中。 仍然不是很安全,但至少秘密没有暴露。
  3. 仅使用客户端ID而不是访问令牌来允许访问某些function。 这可能是最简单的,但它引入了不一致性,并且需要多种方式来validation客户端。
  4. 构建并使用随附的Web应用程序为移动应用程序生成应用程序访问令牌。 从表面上看似乎是一个胜利者,但现在你必须保护访问伴侣应用程序!

如何使用OAuth2从移动设备安全地validation对API的访问,而无需用户首次登录?

同意对Q的评论。要么:

1.)在OAuth 2中使用客户端凭据授予类型 – 在您的应用程序中使用嵌入的秘密。 了解这不是超级安全的,有人会最终对其进行逆向工程。 理想情况下,每个客户端都会获得一个独特的秘密 – 因此,如果客户滥用它,您可以撤销该客户端。

2.)使该API处于打开状态 – 因此根本不需要OAuth 2访问令牌。 也许只有你的应用程序才能知道这个API – 但是,有人反向设计它只是时间问题。

我的小组正在进行类似的讨论。 用户无需登录即可获取应用程序并浏览目录。 目录和其他数据通过API访问,我们希望强制用户为所有呼叫设置access_token。

我们目前的想法是

  • 始终强制App为access_token交换公共clientId / secret。 因此,即使对于匿名用户,该应用也会获得access_token。 这将通过client_credentials oAuth流程进行。
  • 如果用户登录,请使用oAuth密码流。 他们会传递clientId,secret,用户名和密码。 我们还允许他们传递他们的匿名令牌,以便我们可以从他们的匿名会话中传输任何历史记录。

所以例如……

access_token = api.oAuth.client_credentials(clientId, secret) catalog = api.getCatalog(access_token) authenticated_access_token = api.oAuth.password(clientId, secret, username, password, access_token)