AccountManager - authToken已设置但peekAuthToken返回null

6

我试图在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;
}

起初我想也许我的新账户的引用不正确(例如来自于 AccountManager 的引用),所以我重新搜索了一遍帐户。

你能否给我一些关于我做错了什么或如何确保 authToken 为某个帐户设置的指示呢?

谢谢

1个回答

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


1
我想你在谈论 https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java ? - shkschneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接