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

Joh*_*nGB 36 android certificate jwt google-play-services

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

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

99%的情况下,这很好用,但我经常会遇到"孩子"与任何已发布的Google证书不对应的情况,因此我无法授权令牌.

编辑:

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

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

我目前的想法是,它可能来自从谷歌播放以外的网站下载APK的用户,但我现在无法验证这一点.

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

113*_*408 2

有点晚了,但对于遇到同样情况的人,我建议检查Installer您的应用程序。

使用PackageManager.getInstallerPackageName()

getInstallerPackageName (String packageName) 检索安装包的应用程序的包名称。这可以识别包裹来自哪个市场

如果该值为“com.android.vending”,则该应用程序是从 Play 商店安装的,否则请处理其他供应商。