在这个简单的 Android 应用案例中,我需要 OAuth 2.0 提供啥?

Posted

技术标签:

【中文标题】在这个简单的 Android 应用案例中,我需要 OAuth 2.0 提供啥?【英文标题】:What do I need from OAuth 2.0 in this simple Android app case?在这个简单的 Android 应用案例中,我需要 OAuth 2.0 提供什么? 【发布时间】:2012-09-04 15:09:29 【问题描述】:

故事:我正在制作一个允许用户购买订阅的 android 应用,并且不需要用户拥有帐户或登录名。我想检查用户是否购买了订阅,以及the Google Play Android Developer API seems to provide this service。

问题 (TL;DR): 我应该将 OAuth 用作“Web 应用程序”、“已安装的应用程序”、“服务应用程序”,还是不作为上面?

问题:要开始解决这个问题,有人告诉我:

对 Google Play Android 开发者 API 的访问是通过使用身份验证的 OAuth 2.0 Web 服务器流程。在使用 API 之前,您将 需要设置一个 API 控制台项目,创建一个客户端 ID 和 生成刷新令牌。 -source

很公平。然后有设置说明继续说:

在第二个页面上,选择 Web 应用程序并设置重定向 URI 和 javascript 的起源。

我的应用程序确实可以访问 Internet,但它是一个已安装的 Android 应用程序,不是一个 Web 应用程序,所以我没有“重定向 URI”或“Javascript 来源”来链接它.此外,这将需要用户登录,我不希望并且在我的情况下没有必要(我只想检查用户是否购买了订阅)。

因此,如果我尝试创建“已安装的应用程序 (Android)”而不是“网络应用程序”,这仍然需要用户登录,才能管理用户的资源。

我不想要这个。还有第三种选择,称为“服务帐户”,不需要用户登录:

当您有要处理的服务时使用服务帐户 其“自有”资源(例如,管理计算的 App Engine 应用 引擎资源),而不是外部用户的资源 (例如,标准 OAuth 流程)。使用服务帐户,应用程序将 成为资源的所有者...如果您使用服务帐户,您将只能获得有关服务购买的数据。 -source

我不确定这是否是我想要的...

最后还有这个选项:

最简单的流程是不需要最终用户授权的流程。 您仍然需要使用 API 密钥来识别您的客户端应用程序。 -source

这看起来很完美!但是,最初有人告诉我,要使用 Google Play Android Developer API,我需要使用 OAuth 2.0 进行身份验证,这不使用最初告诉我特别需要的客户端 ID。

【问题讨论】:

【参考方案1】:

您在此处尝试实现的目标至少存在 2 个问题:

    当您将在 Android 应用程序中处理服务器响应时,您的代码中会出现这样的内容:

    if (isSubscriptionValid())
    

    有人可能会在他的设备上篡改您应用程序的 APK(这很容易),只需将检查替换为:

    if (true)
    

    然后,攻击者无需订阅即可访问您的内容。

    由于对 API 的调用必须由您的开发者帐户授权,并且在每个用户设备上亲自登录显然是没有选择的,因此您必须使用服务帐户,因为您已经正确理解了。

    但是,这些仅适用于server-to-server interactions,否则它将要求您将私钥存储在每个人的设备上,并且由于无法在 Android 设备上安全地存储数据,因此您将无法满足此要求:

    必须安全地存储和管理私钥。

Google recommends你有一个后端服务器来做这种检查。因此,您可以在将内容移交给客户和其他事情之前确定订阅是否有效:

该 API 旨在从您的后端服务器使用,作为安全管理订阅以及扩展订阅并将订阅与其他服务集成的一种方式。

如果您没有可用的后端服务器,则必须依赖In-app Billing Notifications。

【讨论】:

以上是关于在这个简单的 Android 应用案例中,我需要 OAuth 2.0 提供啥?的主要内容,如果未能解决你的问题,请参考以下文章

8.Android-简单的登录案例编写

Android开发获取当前经纬度和详细位置信息(原生代码实现)简单案例

Android搜索功能的案例,本地保存搜索历史记录......

Android搜索功能的案例,本地保存搜索历史记录

Android搜索功能的案例,本地保存搜索历史记录

viewerjs 在html打开图片或打开pdf文件使用案例