故事: 我正在制作一款允许用户购买订阅的Android应用,并且不需要用户拥有帐户或登录。我想检查用户是否购买了订阅,the Google Play Android Developer API seems to provide this service。
问题(TL; DR): 我应该将OAuth用作“Web应用程序”,“已安装的应用程序”,“服务应用程序”,还是不使用OAuth以上?
问题: 为了开始这个,我被告知:
使用以下身份验证对Google Play Android Developer API的访问权限 OAuth 2.0 Web服务器流程。在您使用API之前,您将会这样做 需要设置API控制台项目,创建客户端ID和 生成刷新令牌。 -source
足够公平。然后有设置说明继续说:
在第二页上,选择Web应用程序并设置重定向URI 和Javascript起源。
我的应用程序确实访问了互联网,但它是一个安装的Android应用程序,不是一个Web应用程序,因此我没有“重定向URI”或“Javascript origin”来将其链接到。此外,这将需要用户登录,这是我不想要的,在我的情况下是不必要的(我只想检查用户是否购买了订阅)。
因此,如果我尝试创建“已安装的应用程序(Android)”而不是“Web应用程序”,则仍需要用户登录,以便能够管理用户的资源。
我不想要这个。还有一种称为“服务帐户”的替代方案,不需要用户登录:
当您拥有想要处理的服务时,将使用服务帐户 它的“自有”资源(例如,管理Compute的App Engine应用程序 引擎资源),而不是外部用户的资源 (例如,标准OAuth流程)。使用服务帐户应用程序将 是资源的所有者...如果您使用服务帐户,您将只获得有关服务购买的数据。 -source
我不确定这是否是我想要的......
最后,还有这个选项:
最简单的流程是不需要最终用户授权的流程。 您仍然需要使用API密钥标识您的客户端应用程序。 -source
这看起来很完美!但是,我最初被告知要使用Google Play Android Developer API,我需要使用OAuth 2.0进行身份验证,而且这不会使用我最初被告知我特别需要的客户端ID。
答案 0 :(得分:2)
您在此处尝试实现的目标至少有两个问题:
正如您在Android应用程序中处理服务器响应一样,您的代码中会有类似的内容:
if (isSubscriptionValid())
有人可能会在他的设备上篡改你的应用程序的APK(这非常简单),只需用以下内容替换该检查:
if (true)
攻击者无需订阅即可访问您的内容。
由于您的开发者帐户必须授权对API的调用,并且亲自登录每个用户设备显然无法选择,因此您必须使用服务帐户,因为您已经正确地找到了
但这些仅适用于server-to-server interactions,否则它会要求您将私钥存储在每个设备上,并且由于无法在Android设备上安全地存储数据,您将无法满足此要求要求:
必须安全地存储和管理私钥。
Google recommends你有一个后端服务器来做这种检查。因此,在将内容移交给客户端之前,您可以决定订阅是否有效:
API旨在用作后端服务器,用于安全管理订阅,以及扩展和集成订阅与其他服务。
如果您没有可用的后端服务器,则必须依赖In-app Billing Notifications。