AccountManager:invalidateAuthToken 不会使令牌失效 [英] AccountManager: invalidateAuthToken does not invalidate the token

查看:43
本文介绍了AccountManager:invalidateAuthToken 不会使令牌失效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从存储在 Android 设备中的 Google 帐户中获取一个全新的令牌,但我得到的只是过去几天我一直在缓存的旧令牌.好像缓存在手机某处,连上网请求都发不出去(我在没有上网的app中测试,返回相同的token).

I'm trying to get a brand new token from a Google account stored in a Android device but all that I got is the same old token that I've been caching in the last days. It seems that it's cached somewhere in the phone, and even the Internet request is not being sent (I made the test in the app without Internet connection and the same token is returned).

在从 AccountManagerFuture 获取带有 getResult 的新方法之前,我使用了 invalidateAuthToken 方法.请看:

I used the invalidateAuthToken method before getting a new one with getResult from AccountManagerFuture. Take a look please:

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

一个线程通过单例实例从 Util 类调用此方法.清单具有所有必要的权限.有人知道为什么令牌没有刷新吗?

A thread called this method from a Util class by singleton instance. The manifest has all the permissions necessary. Does somebody have idea why the token is not refreshed?

推荐答案

要使身份验证令牌失效,您需要将要失效的令牌作为第二个参数传递给 invalidateAuthToken.请参阅的4.4.3 使身份验证令牌无效"部分这篇博文.该页面上的视频也很有帮助.

To invalidate the auth token you need to pass the token you want to invalidate as the second argument to invalidateAuthToken. Please see section "4.4.3 Invalidate the auth token" of this blog post. The video on that page is also helpful.

invalidateAuthToken 提到第二个参数可能为null,但这仅意味着允许使用null调用此方法,而不是如果传递null则每个缓存的令牌都无效.

The documentation for invalidateAuthToken mention that the second argument may be null, but this only mean that it's allowed to call this method with null, not that every cached token is invalidated if null is passed.

如果你这样做,你的代码应该可以工作:

If you do something like this instead your code should work:

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

这篇关于AccountManager:invalidateAuthToken 不会使令牌失效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆