我正在尝试添加一个新帐户(在 Facebook 登录 + 服务器之后 验证)在 AccountManager 中。这个案例的流程是这样的:
- 用户使用 Facebook 登录
- 我在登录完成后获得了详细信息,并根据我服务器上的数据对其进行了验证
- 如果一切正常,服务器返回一个auth_token(JWT token)
- 有了用户的详细信息和 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?
谢谢
最佳答案
我不会依赖于不同于 AbstractThreadedAccountAuthenticator's getAuthToken() 的显式设置 authToken方法。 我的猜测是 authToken 在您请求时尚未缓存。
我建议只通过 AccountManager.addAccountExplicitly() 创建帐户并在真正需要时推迟访问 authToken。
在AbstractThreadedAccountAuthenticator's getAuthToken()我建议像我刚才创建的项目一样应用逻辑。
- 通过 AccountManager.peekAuthToken() 请求 authToken
- 如果在缓存中设置了 authToken,则返回它。
- 如果没有,则从您的服务器请求它,然后通过 AccountManager.setAuthToken() 缓存并最终返回。
希望这对你有帮助:
关于android - AccountManager - authToken 已设置但 peekAuthToken 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183476/