4

我正在开发一个客户端-服务器应用程序,并希望为用户提供单点登录,让他们可以使用 Google 登录。我打算通过使用 AccountManager 在手机上获取访问令牌,然后将此令牌发送到服务器以验证令牌并登录用户来做到这一点。

当我在 AccountManager 中调用 getAuthToken 方法时,会显示一个对话框,用户必须允许这样做,但是 Android 上的 Chrome 允许您登录并将浏览器数据与您的 Google 帐户同步,而不会显示此对话框。因此,Chrome 似乎能够在不向用户显示任何对话框的情况下获取访问令牌,如果我可以对我的应用程序执行相同操作,那就太好了。

在查看 Android 的源代码和getAuthToken 的实现时, 如果应用程序是预安装的应用程序或应用程序 UID 与身份验证器的 UID(Google 帐户)相同,则似乎自动授予访问权限。

我的应用程序和 Chrome 都没有预装,因此在这两种情况下检查都是错误的。我的应用程序当然不能与 Google 帐户身份验证器共享 UID,我假设 Chrome 有可能与身份验证器共享 UID,因为 Google 创建了它们。如果是这种情况,那么它将解释为什么 Chrome 不显示任何对话框。

在请求我可能丢失的访问令牌时,是否有其他方式不向用户显示此对话框?

4

1 回答 1

5

不,这是不可能的

在仔细阅读 Android 源代码后,我发现hasAuthenticatorUid()方法不仅在 UID 相同的情况下返回 true,而且在应用程序使用与身份验证器签名的相同签名时返回 true。

为了验证 Chrome 是否属于这种情况,我在 Chrome apk 文件中使用了android-apktool,以便能够查看 Chrome 的 manifest.xml。在那里我可以看到 Chrome 没有使用与身份验证器共享的 UID。

之后,我用自己的调试密钥重新签署了 Chrome apk 并将该 apk 安装在我的手机上。当我这样做并尝试登录 Chrome 时,我得到了几个“权限请求”对话框。

因此,很明显 Chrome 和身份验证器使用相同的密钥进行签名,这就是 Chrome 可以自动获得其他第三方应用程序无法获得的权限的方式。

因此,第三方应用程序不可能在不向用户显示请求许可的对话框的情况下获取 Google 帐户的令牌,这毕竟是一件非常好的事情。我不希望我手机上的任何随机应用程序能够在我不知情的情况下获取我帐户的访问令牌。

于 2012-11-27T14:11:36.023 回答