AccountManager: invalidateAuthToken не делает токен недействительным

Я пытаюсь получить новый токен из учетной записи Google, хранящейся на устройстве Android, но все, что у меня есть, это тот же самый старый токен, который я кэшировал в последние дни. Такое впечатление, что он где-то в телефоне кэшируется, и даже интернет-запрос не отправляется (проверил в приложении без интернета, возвращается тот же токен).

Я использовал метод invalidateAuthToken, прежде чем получить новый с getResult от AccountManagerFuture. Взгляните, пожалуйста:

public String updateToken(Activity activity) throws Exception {             
    AccountManager am = AccountManager.get(activity);
    Account[] accounts = am.getAccountsByType("com.google");

    if (accounts == null || 
        accounts.length == 0 || 
        "".equals(accounts[0].name.trim())) 
    {
        throw new Exception("Não há contas Google configuradas no smartphone.");
    } 
    else if (!"[email protected]".equals(accounts[0].name.trim()) && 
             !"[email protected]".equals(accounts[0].name.trim()) &&
             !"[email protected]".equals(accounts[0].name.trim())) 
    {
        Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
        throw new Exception("Conta Google não autorizada.");
    }
    Log.w("Util.updateToken","conta obtida: " + accounts[0].name);
    am.invalidateAuthToken("com.google", null);
    Log.w("Util.updateToken","Passou do invalidateAuthToken");
    AccountManagerFuture<Bundle> future = 
        am.getAuthToken(accounts[0], "ah", null, activity, null, null);
    Log.w("Util.updateToken","Passou do getAuthToken");
    Bundle bundle = future.getResult();
    Log.w("Util.updateToken","Passou do getResult");
    future = null;
    am = null;
    accounts = null;
    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
    Log.w("Util.updateToken","Token: " + authToken);
    return authToken;
}

Поток вызвал этот метод из класса Util по единственному экземпляру. Манифест имеет все необходимые разрешения. Кто-нибудь знает, почему токен не обновляется?


person user1687598    schedule 21.09.2012    source источник


Ответы (2)


Чтобы аннулировать токен авторизации, вам нужно передать токен, который вы хотите аннулировать, в качестве второго аргумента для invalidateAuthToken. См. раздел «4.4.3 Недействительность токена аутентификации» этот пост в блоге. Видео на этой странице также полезно.

Документация для invalidateAuthToken упоминает, что второй аргумент может быть нулевым, но это означает только то, что этот метод разрешено вызывать с нулевым значением, а не то, что каждый кэшированный токен становится недействительным, если передается нуль.

Если вы сделаете что-то подобное, ваш код должен работать:

// Get token
AccountManagerFuture<Bundle> future = am.getAuthToken(accounts[0], "ah", null, activity, null, null);
Bundle bundle = future.getResult();
String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

// invalidate the token since it may have expired.
am.invalidateAuthToken("com.google", authToken);

// Get token again
future = am.getAuthToken(accounts[0], "ah", null, activity, null, null);
bundle = future.getResult();
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
person nibarius    schedule 27.11.2012

Проще просто «заглянуть» в текущий кэшированный токен, проверить, действителен ли он, и при необходимости создать новый.

String authToken = accountManager.peekAuthToken(account, Constants.AUTHTOKEN_TYPE);
// validate the token, invalidate and generate a new one if required
accountManager.invalidateAuthToken(Constants.ACCOUNT_TYPE, authToken);
accountManager.blockingGetAuthToken(account,
                Constants.AUTHTOKEN_TYPE, NOTIFY_AUTH_FAILURE);
person Jeshurun    schedule 06.10.2013
comment
Согласно документации peekAuthToken, это может использоваться только аутентификатором учетной записи (или кем-то еще, имеющим тот же UID): этот метод требует, чтобы вызывающая сторона имела разрешение AUTHENTICATE_ACCOUNTS и имела тот же UID, что и аутентификатор учетной записи. Итак невозможно использовать это для учетных записей google - person nibarius; 27.03.2014
comment
как упоминал @nibarius - это выдает java.lang.SecurityException: uid XXXX не может просматривать токены аутентификации, связанные с учетными записями типа: com.google - person Ohad Cohen; 30.08.2016