具有多个认证令牌类型的Android AccountManager

问题描述:

我遵循syncadapter示例创建AccountManager和同步适配器。我想在同一个帐户下为不同目的使用两种不同类型的authtokens(访问不同的服务 - 同步适配器使用其中一种)。具有多个认证令牌类型的Android AccountManager

事情的工作,但我发现,当我认证(通过getauthtoken)一个authtoken类型,保存它的过程替换其他authtoken类型。我在前后查看了accounts.db文件。在调用authtoken类型为“B”的令牌之前,accounts.db中的authtoken表具有用于auth类型“A”的authtoken。在调用之后,accounts.db中的authtoken表具有“B”类型的authtoken,但“A”已被删除。无论订单如何,帐户管理员子系统似乎都不会为我的帐户类型存储每个帐户一个以上的验证字。

当你有多个authtoken类型时,你需要在某个xml文件中配置什么特别的东西吗?

+0

当您保存令牌时,您确定将其保存为特定类型吗? – CChi 2014-09-10 21:03:52

+0

我首先想到的可能是,但我没有看到指定类型的方法。该标记使用AccountAuthenticatorActivity中的继承的setAccountAuthenticatorResult()方法进行设置。 extras包中的值不指定类型 - 类型是使用getAuthToken()传递的。 AccountManager中的任何键(例如KEY_ACCOUNT_NAME)都不会引用authtoken类型,除非我错过了它。 但我看到authtoken类型在accounts.db中设置正确 - 只是删除了其他authtoken类型记录。 – BJV 2014-09-10 21:28:18

+0

,您可以指定类型,传入AccountManager.KEY_ACCOUNT_TYPE作为关键字,并将帐户类型的字符串表示形式作为值。 – CChi 2014-09-10 21:30:31

我发现我的问题。如果您因身份验证/登录成功而调用AccountManager.setPassword(),则会使您的帐户的所有身份验证令牌失效。这是一个无证的副作用,在某些情况下,这是有道理的。不加区别地将密码设置为相同值的软件将意外地使其认证令牌无效。