在这个简单的Android应用案例中,我需要从OAuth 2.0中获得什么?

时间:2012-09-11 16:13:54

标签: android oauth oauth-2.0 google-play subscription

故事: 我正在制作一款允许用户购买订阅的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。

1 个答案:

答案 0 :(得分:2)

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

  1. 正如您在Android应用程序中处理服务器响应一样,您的代码中会有类似的内容:

    if (isSubscriptionValid())
    

    有人可能会在他的设备上篡改你的应用程序的APK(这非常简单),只需用以下内容替换该检查:

    if (true)
    

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

  2. 由于您的开发者帐户必须授权对API的调用,并且亲自登录每个用户设备显然无法选择,因此您必须使用服务帐户,因为您已经正确地找到了

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

      

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

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

      

    API旨在用作后端服务器,用于安全管理订阅,以及扩展和集成订阅与其他服务。

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