是否可以在不触发“权限请求”对话框的情况下从 AccountManager 获取身份验证令牌?

nib*_*ius 4 android oauth single-sign-on accountmanager

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

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

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

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

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

nib*_*ius 5

不,这不可能

更仔细地阅读Android源代码后,我发现hasAuthenticatorUid()方法不仅在UID相同时返回true,而且如果应用程序使用与authenticator相同的签名进行签名,则返回true。

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

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

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

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