Android AppEngine Endpoints身份验证和应用内计费

17

我遇到了一个棘手的问题。

我正在使用Appengine Endpoints实现我的服务器端API。这个API向我的用户返回一些数据。应用程序支持应用内产品购买。我的想法很简单:一旦用户购买某个产品,API将返回附加数据。直接的方法是将标志作为参数传递给API。但我想通过启用OAuth认证来使其更加安全。因此,一旦用户购买某物,它会在服务器上进行验证并记录。因此,我的API端点将始终知道要向特定用户返回什么数据。

然而,问题如下。我不想强制用户进行身份验证,除非他们想购买东西。但是,如果用户使用另一台设备,而没有通过我的应用程序登录他们的Google帐户,那么他们就无法获得所有已购买的产品数据,而只能获得免费数据。我可以通过play服务查询已购买的产品,但我仍需要在我的服务器上进行身份验证或传递标志以获取完整的数据。

这些事情通常是如何完成的?我能否默默地使用用户的第一个谷歌帐户(据我所知,保证是Play Store使用的)在我的服务器上进行身份验证,还是错了?

谢谢。


这是一个相当老的问题,我已经以不同的方式解决了这个问题。但是,鉴于您上面微妙的提示(尽管我认为这样做并不好),以及您在回答中付出的努力,我将把它标记为已接受。 - EvilDuck
1个回答

7

你提到的内容应该使用 OAuth 2.0

你可以在服务器端使用第一个允许身份验证的Google帐户。OAuth 2.0是一个很好的工具,可以简化并为开发人员提供一种轻松的方式,允许用户访问你的应用程序,无论是游戏还是交易平台。OAuthHmacSigner对象将管理身份验证,因为它已初始化:

signer = new OAuthHmacSigner();
signer.clientSharedSecret = Constants.CONSUMER_SECRET;

接下来,Android activity 使用以下代码启动 OAuth 流程:

launchOauth.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        startActivity(new Intent().setClass(v.getContext(),
                PrepareRequestTokenActivity.class));
    }
});

要在您的应用程序中实现它,您可以使用Java集成OAuth 2.0 Google OpenID,但您也可以选择使用Python或Ruby。它提供了几个工具来增加安全性,并使构建防伪造状态令牌变得容易:
String state = new BigInteger(130, new SecureRandom()).toString(32);
request.session().attribute("state", state);
return new Scanner(new File("index.html"), "UTF-8")
  .useDelimiter("\\A").next()
  .replaceAll("[{]{2}\\s*CLIENT_ID\\s*[}]{2}", CLIENT_ID)
  .replaceAll("[{]{2}\\s*STATE\\s*[}]{2}", state)
  .replaceAll("[{]{2}\\s*APPLICATION_NAME\\s*[}]{2}",
              APPLICATION_NAME);

为了获得OAuth 2.0访问令牌,您只需调用以下方法:
AccountManager.getAuthToken() 

使用oauth2的authTokenType请求令牌,然后像往常一样将其集成到托管在服务器端的后端中。

1
谢谢。最终我使用了AppEngine Endpoints API,它在幕后使用了OAuth。作为令牌,我总是使用第一个账户。到目前为止,它运行得很好。 - EvilDuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接