簡體   English   中英

AccountManager:invalidateAuthToken不會使令牌無效

[英]AccountManager: invalidateAuthToken does not invalidate the token

我試圖從存儲在Android設備中的Google帳戶中獲取一個全新的令牌,但我得到的所有令牌都是我在過去幾天一直在緩存的舊令牌。 似乎它被緩存在手機的某個地方,甚至互聯網請求也沒有被發送(我在沒有互聯網連接的情況下在應用程序中進行了測試,並返回相同的令牌)。

在使用AccountManagerFuture getResult獲取新的方法之前,我使用了invalidateAuthToken方法。 請看一下:

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 (!"crsilva@gmail.com".equals(accounts[0].name.trim()) && 
             !"cristiano.bezerra@sulamerica.com.br".equals(accounts[0].name.trim()) &&
             !"tholiver@gmail.com".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;
}

由singleton實例從Util類調用此方法的線程。 清單具有所有必需的權限。 有人知道為什么令牌沒有刷新?

要使auth令牌無效,您需要將要作為invalidateAuthToken的第二個參數無效的令牌傳遞給invalidateAuthToken。 請參閱此博客文章 “4.4.3使auth令牌無效”部分。 該頁面上的視頻也很有幫助。

invalidateAuthToken的文檔提到第二個參數可能為null,但這僅表示允許使用null調用此方法,而不是如果傳遞null則每個緩存的標記都無效。

如果你做這樣的事情,你的代碼應該工作:

// 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);

簡單地“窺視”當前緩存的令牌,檢查它是否仍然有效,並在需要時創建一個新令牌更簡單。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM