使用相同的AccountType在多个具有不同签名证书的应用程序中将凭证存储在AccountManager中

时间:2017-01-18 13:17:23

标签: android accountmanager securityexception

我们正在开发一个库,用于处理具有不同签名证书的多个应用的​​身份验证。这个库公开了几种调用我们服务器的方法(创建用户,删除它们,更新数据等)。

库还负责与AccountManager交互以存储凭证,即用户名,authtoken和刷新令牌。当发出请求时,它正在侦听“401 Unauthorized - token expired”,在这种情况下,使令牌无效并从AccountManager获取一个新令牌(通过使用存储的刷新令牌从我们的服务器获取一个新令牌) )。

AccountManager具有以下功能。当多个帐户共享相同的帐户类型时,将使用第一个安装的应用程序的AccountAuthenticator(包含AccountAuthenticator的所有逻辑的类)类。

为了在其上添加一些名称,我们获得了使用certificateA签署的AppA和AuthA(AccountAuthenticator类)以及使用certificateB签名的AuthB的AppB。两者都使用accountType“sharedname” 首先安装AppA,以便AuthA与帐户类型“sharedname”相关联。然后安装了AppB,因为已经有一个已与accountType“sharedname”关联的AccountAuthenticator,从AppB调用AccountManager时将使用AuthA。

自API 22起,AccountManager中的某些方法在从使用与使用的AccountAuthenticator不同的证书签名的应用程序中调用时抛出SecurityException。

这就是问题(最后!): 我们在库中创建了一个方法 createUser ,用于在服务器中创建用户,如果成功,则在AccountManager中插入新帐户。从AppB调用 createUser 时,会调用`AccountManager.get(mContext).addAccountExplicity(...)'并产生SecurityException,因为使用的身份验证器是AuthA。

AddAccount不是一个选项(据我所知),因为createUser是从不同应用的登录活动中调用的。

¿如何在不使用活动的情况下从AppB向AccountManager添加帐户?

使用AccountManager.get(mContext)删除帐户时遇到了同样的问题.removeAccount(...);

我希望很清楚,如果您需要更好的解释,请告诉我,这是可能的。

谢谢!

0 个答案:

没有答案