3

故事:我正在制作一个允许用户购买订阅的 Android 应用程序,并且不需要用户拥有帐户或登录名。我想检查用户是否购买了订阅, Google Play Android Developer API 似乎提供了这项服务

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

问题:要开始这个,我被告知:

使用 OAuth 2.0 Web 服务器流对访问 Google Play Android Developer API 进行身份验证。在使用 API 之前,您需要设置 API 控制台项目、创建客户端 ID 并生成刷新令牌。-资源

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

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

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

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

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

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

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

最后,还有这个选项:

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

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

4

1 回答 1

2

您在这里尝试实现的目标至少有两个问题:

  1. 由于您将在 Android 应用程序中处理服务器响应,因此您的代码中将包含以下内容:

    if (isSubscriptionValid())
    

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

    if (true)
    

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

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

    然而,这些仅适用于服务器到服务器的交互,否则它将要求您将私钥存储在每个人的设备上,并且由于无法在 Android 设备上安全地存储数据,因此您将无法满足此要求:

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

Google 建议您使用后端服务器来执行此类检查。因此,您可以在将内容移交给客户和其他事情之前确定订阅是否有效:

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

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

于 2012-09-12T07:22:34.907 回答