AccountManager - authToken已设置但peekAuthToken返回null

时间:2015-05-12 06:35:15

标签: android facebook accountmanager

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

  1. 用户登录Facebook
  2. 我在登录完成后得到了详细信息,并根据我服务器上的数据对其进行了验证
  3. 如果一切正常,服务器将发回auth_token(JWT令牌)
  4. 拥有用户的详细信息和auth_token我正在通过AccountManager创建一个帐户,一旦创建了帐户,我将authToken设置为 它。
  5. 在下次登录时,当用户重新打开应用程序时,我会调用getAuthToken,它首先尝试通过调用peekAuthToken()来获取缓存的authToken。
  6. 问题

    在第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 :(得分:0)

我不会依赖于明确设置authToken而不是AbstractThreadedAccountAuthenticator's getAuthToken()方法。 我的猜测是,当你提出请求时,authToken还没有被缓存。

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

AbstractThreadedAccountAuthenticator's getAuthToken()我建议应用逻辑,就像我之前创建的项目一样。

  1. 通过AccountManager.peekAuthToken()
  2. 请求authToken
  3. 如果在缓存中设置了authToken,则将其返回。
  4. 如果没有,则从服务器请求,然后通过AccountManager.setAuthToken()缓存,最后返回。
  5. 链接:https://github.com/dawidgdanski/AccountAuthenticatorExample/blob/master/app/src/main/java/com/authenticator/account/auth/SimpleAuthenticator.java

    希望这会帮助你:

    https://github.com/dawidgdanski/AccountAuthenticatorExample