[英]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.