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

时间:2012-11-21 06:54:41

标签: android oauth single-sign-on accountmanager

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

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

在查看Android和implementation of getAuthToken的源代码时,如果应用程序是预安装的应用程序,或者应用程序UID与验证程序的UID相同,则可能会自动授予访问权限。帐户)。

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

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

1 个答案:

答案 0 :(得分:4)

不,这是不可能的

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

要验证Chrome是否属实,我已使用Chrome apk文件上的android-apktool来查看Chrome的manifest.xml。在那里,我可以看到Chrome不使用与身份验证器共享的UID。

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

由于这一点,很明显Chrome和验证者使用相同的密钥签名,这就是Chrome可以自动获取其他第三方应用无法获得的权限。

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