AccountManager - authToken已设置但peekAuthToken返回null

Ung*_*viu 6 android facebook accountmanager

我正在尝试在AccountManager中添加一个新帐户(在Facebook登录+服务器验证之后).这种情况的流程如下:

  1. 用户使用Facebook登录
  2. 登录完成后我得到了详细信息,并根据我服务器上的数据验证它们
  3. 如果一切正常,服务器会发回一个auth_token(JWT令牌)
  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;
}
Run Code Online (Sandbox Code Playgroud)

首先,我认为可能对我的新帐户的引用不正确(来自AccountManager的那个)所以我再次搜索帐户.

你能告诉我一些关于我做错了什么的指示,或者我应该如何确保为帐户设置authToken?

谢谢

daw*_*ski 0

我不会依赖于与AbstractThreadedAccountAuthenticator 的 getAuthToken()方法不同的显式设置 authToken 。我的猜测是,当您请求时 authToken 尚未缓存。

我建议仅通过AccountManager.addAccountExplicitly()创建帐户,并在真正需要时推迟访问 authToken。

AbstractThreadedAccountAuthenticator 的 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