android - AccountManager - authToken 已设置但 peekAuthToken 返回 null

标签 android facebook accountmanager

我正在尝试添加一个新帐户(在 Facebook 登录 + 服务器之后 验证)在 AccountManager 中。这个案例的流程是这样的:

  1. 用户使用 Facebook 登录
  2. 我在登录完成后获得了详细信息,并根据我服务器上的数据对其进行了验证
  3. 如果一切正常,服务器返回一个auth_token(JWT token)
  4. 有了用户的详细信息和 auth_token 我正在通过 AccountManager 创建一个帐户,一旦创建,我就设置了 authToken
  5. 下次登录时,当用户重新打开应用程序时,我调用 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()我建议像我刚才创建的项目一样应用逻辑。

  1. 通过 AccountManager.peekAuthToken() 请求 authToken
  2. 如果在缓存中设置了 authToken,则返回它。
  3. 如果没有,则从您的服务器请求它,然后通过 AccountManager.setAuthToken() 缓存并最终返回。

链接:https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

希望这对你有帮助:

https://github.com/dawidgdanski/AccountAuthenticatorExample

关于android - AccountManager - authToken 已设置但 peekAuthToken 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30183476/

相关文章:

android - 日历事件 UI android

java - 在Android中实现数据缓存

facebook - 通过图形 API 的新闻提要与我在 facebook.com 上看到的非常不同

android - 当 AccountManager 删除帐户时,SyncAdapter 会收到通知吗?

android - 获取用于应用内结算购买的 Google ID

android - 是否可以以编程方式添加和配置交换帐户

android - 带有自定义 ArrayAdapter 的 ListView 未更新

AndroidX Espresso 测试 : No tests were found and Empty test suite

android - 无法从 GraphRequest Facebook 获取值

php - 如何减少执行时间?