加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – AccountManager:invalidateAuthToken不会使令牌无效

发布时间:2020-12-15 04:58:51 所属栏目:Java 来源:网络整理
导读:我试图从存储在 Android设备中的Google帐户中获取一个全新的令牌,但我得到的所有令牌都是我在过去几天一直在缓存的旧令牌.似乎它被缓存在手机的某个地方,甚至互联网请求也没有被发送(我在没有互联网连接的情况下在应用程序中进行了测试,并返回相同的令牌).
我试图从存储在 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,"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.请参阅 this blog post的“4.4.3使身份验证令牌无效”部分.该页面上的视频也很有帮助.

invalidateAuthToken的文档提到第二个参数可能为null,但这仅表示允许使用null调用此方法,而不是如果传递null则每个缓存的标记都无效.

如果你做这样的事情,你的代码应该工作:

// Get token
AccountManagerFuture<Bundle> future = am.getAuthToken(accounts[0],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],null);
bundle = future.getResult();
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读