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

时间:2011-12-05 17:15:28

标签: android ios security oauth oauth-2.0

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

  

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

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

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

  1. 将客户端密码嵌入应用程序中。从安全的角度来看似乎并不理想,但也许我们错过了一种明显的方法来保护它?我们的目标是至少iOS和Android。
  2. 离线生成应用访问令牌并将其嵌入应用中。仍然不是很安全,但至少秘密没有曝光。
  3. 仅使用客户端ID而不是访问令牌来允许访问某些功能。这可能是最简单的,但它引入了不一致性,需要多种方式来验证客户端。
  4. 构建并使用随播广告网络应用为移动应用生成应用访问令牌。从表面上看,它似乎是一个胜利者,但现在你必须保护对同伴应用程序的访问权限!
  5. 如何使用OAuth2从移动设备安全地验证对API的访问权限,而无需用户首次登录?

2 个答案:

答案 0 :(得分:2)

同意对Q的评论。或者:

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

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

答案 1 :(得分:2)

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

我们目前的想法是

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

所以例如......

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)