我试图在AccountManager中添加一个新帐户(在Facebook登录+服务器验证之后)。此情况的流程如下:
- 用户使用Facebook登录
- 完成登录后,我获取细节并将其与我在服务器上拥有的数据进行验证
- 如果一切正常,则服务器会发送回auth_token(JWT令牌)
- 具有用户详细信息和auth_token后,我通过AccountManager创建一个帐户,并一旦创建完成,为其设置authToken。
- 在下次登录时,当用户重新打开应用程序时,我调用getAuthToken,它首先尝试通过调用peekAuthToken()来获取缓存的authToken。
问题
在第5点,peekAuthToken返回null,但实际上不应该,因为我已经为该帐户设置了autToken。
代码
public static Bundle handleUserLogin(Context context, User user) {
SharedPreferences mPrefs = context.getSharedPreferences(Constants.PREFS_NAME, Context.MODE_PRIVATE);
AccountManager am = AccountManager.get(context);
Account account = new Account(user.getEmail(), ACCOUNT_TYPE);
Account[] accounts = am.getAccountsByType(ACCOUNT_TYPE);
boolean isNewAccount = true;
for (int i = 0; i < accounts.length; i++) {
if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) {
isNewAccount = false;
account = accounts[i];
break;
}
}
if (isNewAccount) {
am.addAccountExplicitly(account, user.getPassword(), null);
accounts = am.getAccountsByType(ACCOUNT_TYPE);
for (int i = 0; i < accounts.length; i++) {
if (user.getEmail().equalsIgnoreCase(accounts[i].name) && ACCOUNT_TYPE.equalsIgnoreCase(accounts[i].type)) {
account = accounts[i];
break;
}
}
}
if (null != user.getPassword()) {
am.setPassword(account, user.getPassword());
}
Cs.error(TAG, "account " + account + " token " + user.getToken());
am.setAuthToken(account, user.getToken(), Authenticator.AUTHTOKEN_TYPE_FULL_ACCESS);
setUserData(user, account, am);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, user.getToken());
mPrefs.edit().putString(Constants.KEY_CURRENT_USER, account.name).commit();
return result;
}
起初我想也许我的新账户的引用不正确(例如来自于 AccountManager 的引用),所以我重新搜索了一遍帐户。
你能否给我一些关于我做错了什么或如何确保 authToken 为某个帐户设置的指示呢?
谢谢