验证用户是否已从 Google Play 商店购买或下载了您的应用的合法副本时,最好在您控制的服务器上执行许可验证检查。
本指南介绍了完成服务器端许可验证的分步过程,并介绍了一些与执行此检查相关的最佳实践。
流程概述
图 1 显示了信息如何在您的应用、Google Play 和您的私有服务器之间传输
- 您的应用向 Google Play 发出请求,询问特定用户是否已购买或下载了您的应用的合法副本。
- Google Play 通过向您的应用发送一个响应数据对象(类型为
ResponseData
的对象)来进行响应。此对象是一个签名的信息片段,说明用户是否已购买或下载了您的应用的合法副本。 - 您的应用向您控制的私有服务器发出请求,验证响应数据的内容。
- 服务器通过向您的应用发送状态来进行响应,指示用户是否确实已购买或下载了您的应用的合法副本。如果服务器提供了“成功”消息,验证响应,然后授予用户对需要许可的资源的访问权限。
由于响应数据已由 Google Play 签名,然后在您的服务器上进行检查,因此无法修改运行您的应用的设备上的对象。如果您的应用依赖于服务器,并且仅向合法用户提供资源,则您的应用将得到更有效的保护,防止未经授权的用户使用。
以下部分提供了执行服务器端许可验证时需要牢记的其他注意事项。
防范重放攻击
在收到 Google Play 关于用户许可状态的响应后,用户可能复制响应数据并多次使用它,或将其提供给其他用户,这些用户随后可以伪造他们自己的请求到您的应用的私有服务器。此类行为被称为重放攻击。
为了降低用户成功执行重放攻击的可能性,在向您的应用的服务器发送请求之前,请采取以下措施
检查响应数据中包含的时间戳,确保 Google Play 最近生成了响应。
对您的服务器请求执行限速,例如指数回退,以减少您的应用尝试将相同响应数据发送到您的应用服务器的次数。
在您的私有服务器上验证 Google Play 响应数据的內容之前,请先向您的私有服务器发出一个基于身份验证的请求。 在此第一个请求中,将用户凭据发送到您的服务器,然后让您的服务器以 *nonce*(仅使用一次的数字)进行响应。 然后,您可以在下一个请求中包含此 nonce,请求您的私有服务器进行许可证验证数据。 有关如何为 nonce 选择适当值的详细信息,请参阅 生成合适的 nonce 值 部分。
生成合适的 nonce 值
使用以下其中一项技术来创建难以猜到的 nonce 值
- 根据用户的 ID 生成哈希值。
- 基于每个用户生成一个随机值。 将此随机值存储在您的应用服务器上,作为给定用户的属性的一部分。
验证来自您的服务器的响应数据
在查看您的应用服务器发送到您的应用的响应数据时,请确保许可证验证库响应未被伪造。 通过将包含在应用服务器响应数据中的签名与您在之前步骤中从 Google Play 收到的密钥进行比较,来验证签名。
还需要记住,特定于许可证验证库 (LVL) 的块是唯一经过签名的部分。 因此,这是您应用服务器响应数据中您应用应该信任的唯一部分。