其他分享
首页 > 其他分享> > android-是否可以在不触发“权限请求”对话框的情况下从AccountManager获取身份验证令牌?

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

作者:互联网

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

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

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

我的应用程序和Chrome均未预先安装,因此两种情况下的检查均不正确.我的应用程序当然不能与Google帐户身份验证器共享UID,并且我认为Chrome可能与Google身份验证器共享UID,因为Google创建了这两个身份验证器.如果是这种情况,那么它将解释为什么Chrome不显示任何对话框.

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

解决方法:

不,不可能

在更仔细地阅读了Android源代码之后,我看到方法hasAuthenticatorUid()不仅在UID相同的情况下返回true,而且在应用程序使用与身份验证器相同的签名进行签名的情况下,也会返回true.

为了验证Chrome是否是这种情况,我使用了Chrome APK文件中的android-apktool来查看Chrome的manifest.xml.在那里,我可以看到Chrome不使用与身份验证器共享的UID.

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

因此,很明显,Chrome和身份验证器是使用相同的密钥签名的,这就是Chrome如何自动获取其他第三方应用程序无法获取的权限.

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

标签:accountmanager,oauth,single-sign-on,android
来源: https://codeday.me/bug/20191031/1977090.html