Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AppEngine端点身份验证和InApp计费_Android_Google App Engine_Authentication - Fatal编程技术网

Android AppEngine端点身份验证和InApp计费

Android AppEngine端点身份验证和InApp计费,android,google-app-engine,authentication,Android,Google App Engine,Authentication,我遇到了一个棘手的问题 我正在使用Appengine端点实现我的服务器端API。这个API将一些数据返回给我的用户。应用程序支持应用程序内产品购买。我的想法很简单:只要用户购买了某个产品,API就会返回额外的数据。简单的方法是将标志作为参数传递给API。但我希望通过对端点启用OAuth身份验证使其更加安全。所以,一旦用户购买了某种东西,它就会在服务器上得到验证和记忆。因此,我的API端点将始终知道要返回给特定用户的数据 然而,问题如下。我不想强迫用户进行身份验证,除非他们想购买。但还有一种情况是

我遇到了一个棘手的问题

我正在使用Appengine端点实现我的服务器端API。这个API将一些数据返回给我的用户。应用程序支持应用程序内产品购买。我的想法很简单:只要用户购买了某个产品,API就会返回额外的数据。简单的方法是将标志作为参数传递给API。但我希望通过对端点启用OAuth身份验证使其更加安全。所以,一旦用户购买了某种东西,它就会在服务器上得到验证和记忆。因此,我的API端点将始终知道要返回给特定用户的数据

然而,问题如下。我不想强迫用户进行身份验证,除非他们想购买。但还有一种情况是,用户可能使用其他设备,而不是通过我的应用程序使用他们的谷歌帐户登录。这样,我的API将只返回免费数据,但用户已支付购买的产品。我可以通过play services查询购买的产品,但我仍然需要在服务器上进行身份验证或传递标志以获取完整数据

这些事情通常是怎么做的?我可以在我的服务器上悄悄地使用用户第一个Google帐户(这是afaik保证的在线商店使用)进行身份验证吗?还是这是错误的

谢谢。

你应该使用你提到的

您可以使用第一个允许在您的服务端进行身份验证的Google帐户。OAuth2.0是一个很好的工具,它简化了开发人员的工作,并使他们能够以一种简单的方式允许用户访问您的应用程序,可能是游戏或交易。OAuthHmacSigner对象将在初始化时为您管理身份验证:

signer = new OAuthHmacSigner();
signer.clientSharedSecret = Constants.CONSUMER_SECRET;
然后,Android活动使用以下代码启动流:

要为应用程序实现它,您可以使用Java集成OAuth 2.0,但也可以选择使用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请求令牌。然后,您可以像往常一样将其集成到服务器端托管的后端。

这是一个很老的问题,我已经以不同的方式解决了这个问题。但是考虑到你的微妙暗示(尽管我不认为这样做很好),以及你在回答中做了一些工作,我会将其标记为接受。谢谢。最后,我使用了AppEngine端点API,它在后台使用OAuth。作为一种象征,我总是使用第一个帐户。到目前为止效果很好。
AccountManager.getAuthToken()