我遇到了一个棘手的问题。
我正在使用Appengine端点来实现我的服务器端API。此API将一些数据返回给我的用户。应用程序支持应用程序产品购买我的想法很简单:只要用户购买某个产品API,就会返回其他数据。直接的方法是将标志作为参数传递给API。但我想通过对我的终端启用OAuth身份验证来使其更安全。因此,只要用户购买了某些内容,就会在服务器上进行验证和记忆。因此,我的API端点将始终知道要返回给特定用户的数据。
然而问题如下。除非他们想要购买,否则我不想强制用户进行身份验证。但是有一种情况是用户可能会使用其他设备,而不是通过我的应用程序使用他们的谷歌帐户登录。这样我的API将只返回免费数据,但用户已经支付了购买的产品。我可以通过播放服务查询购买的产品,但我仍需要在我的服务器上进行身份验证或传递标记以获取完整数据。
这些事情通常如何完成?我是否可以默默使用用户的第一个Google帐户(保证是Play商店使用的帐户)在我的服务器上进行身份验证,或者这是错误的?
感谢。
答案 0 :(得分:7)
您应该使用OAuth 2.0来提及您所提到的内容。
您可以使用第一个允许在服务端进行身份验证的Google帐户。 OAuth 2.0是一个很棒的工具,可以简化并让开发人员轻松地允许用户访问您的应用程序,可能是游戏或交易platform。 OAuthHmacSigner对象将在初始化时为您管理身份验证:
signer = new OAuthHmacSigner();
signer.clientSharedSecret = Constants.CONSUMER_SECRET;
然后Android活动使用以下代码启动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请求令牌。然后,您可以像往常一样将其集成到服务器端托管的后端。