Google Play服务返回使用非Google密钥签名的令牌

时间:2017-04-26 08:56:27

标签: android certificate google-play-services jwt

我有一个Android客户端使用GoogleAuthUtil.getToken(Context context, Account account, String scope)从Google Play服务获取身份验证令牌。

然后将其发送到后端(Go)服务器,该服务器检查该令牌是否来自https://www.googleapis.com/oauth2/v1/cert之一的Google签名证书。要做到这一点,它需要查找分配给"孩子的证书。在令牌标题中。

99%的时间,这个工作得很好,但我经常出现这样的情况:#34;孩子"给定与任何已发布的Google证书不对应,因此我无法对该令牌进行身份验证。

编辑:

我已经在服务器上添加了大量的日志记录来尝试跟踪它,并且有一些关系值得注意:

  1. 任何给定的无效kid仅用于单个用户。我经常会在同一个用户的几天内看到多个请求,其中包含无效的kid,但只能来自该用户。
  2. 提供无效kid的用户从不对任何请求使用有效的kid,或者对请求使用任何其他kid,即使它们相隔数天。 Afaik Google每24小时左右循环一次他们的证书。
  3. 许多用户使用较旧的客户端版本。大多数用户会在发布新版本的一两天内升级,但大多数使用无效证书密钥的用户都会使用几周前的版本。
  4. 这些要求来自全球各地,与我们的用户群一致。
  5. 请求来自各个时代,与我们的用户群一致。
  6. 请求来自各种设备,制造商和型号。
  7. 我目前的想法是,可能是那些从Google Play以外的网站下载过APK的用户,但我现在无法对其进行验证。

    编辑:有一个问题跟踪器,但它似乎已被标记为低优先级。如果有人遇到此问题,请在跟踪器上告知。 https://issuetracker.google.com/issues/37734997

1 个答案:

答案 0 :(得分:0)

有点晚了,但是对于任何遇到相同情况的人,我建议检查您应用的Installer

使用PackageManager.getInstallerPackageName()

  

getInstallerPackageName(字符串packageName)检索软件包名称   安装软件包的应用程序的名称。这确定了哪个   推销包裹的来源

如果该值为“ com.android.vending”,则说明该应用是从Play商店安装的,否则应与其他供应商联系。