具有多个服务器的Android AccountAuthenticator

时间:2016-09-01 17:49:18

标签: java android accountmanager

我开发了一个应用程序,除了核心功能外,还连接到服务器并对其进行身份验证。现在,需求正在发生变化,我正在尝试实现一个能够管理不一定共享数据的同一服务器的几个可能实例的帐户的应用程序。

简而言之,用户需要使用user@company.com连接到ServerA,使用user@company.com连接到ServerB。显然,使用accountName作为用户的电子邮件帐户和accountType作为验证者的标识字符串将无法工作,因为将服务器从A切换到B并返回将使令牌无效,因为A的令牌不适用于B.

因此,我认为有一种方法可以让我想到,但也许有人可以想到更好的解决方案?

在添加帐户时,应用程序将提供服务器地址作为身份验证者选项的一部分:

String serverUrl = "...";
AccountManager am = AccountManager.get(this);
Bundle bundle = new Bundle();
bundle.putString(COMPANY_SERVER_URL, serverUrl);
am.getAccount(
    COMPANY_ACCOUNT_TYPE,
    COMPANY_AUTHTOKEN_TYPE,
    null,
    accountOptions,
    null,
    null
);

验证者将检查提供的选项并将URL传播到活动。创建帐户时,将创建如下帐户:

Account account = new Account(accountName + " at " + serverUrl, accountType);
Bundle userData = new Bundle();

userData.putString(COMPANY_SERVER_URL, serverUrl);
userData.putString(ACCOUNT_NAME, accountName);

am.addAccountExplicitly(account, null, userData);
am.setAuthToken(account, authTokenType, token);
am.notifyAccountAuthenticated(account);

我们的想法是,帐户现在显示为user@company.com at https://server-a.company.com/apiuser@company.com at https://server-b.company.com/api

然后可以将同一过程应用于getAuthToken

你怎么看?有什么建议? AccountManager不应该以这种方式使用吗?如何处理多个服务器实例的帐户以及稍后支持同步?

另外,为了澄清事情,我提前不知道哪些实例可用,因此我无法提前为每个服务器准备验证器。基本上,将其视为本地LAN上的服务器...可能有两个或三个,或者您在安装了这些服务器的位置之间。

作为更新,我注意到AirBnB使用用户的名字和姓氏来识别帐户。可能两个用户可能具有相同的名称。有没有办法管理帐户显示标签?

所以AirBnB实际上是按照我的预期失败了。我猜他们的开发人员认为两个同名的人不会使用同一部手机......这可能是一个很好的假设。

0 个答案:

没有答案