永远不要从getAuthToken请求获取AccountManager.KEY_INTENT

时间:2012-10-19 08:43:31

标签: android

在JellyBean设备上。

我正在关注this请求oauth2令牌,例如

AccountManager am = AccountManager.get(getActivity());
am.invalidateAuthToken(MY_AUTH_TOKEN_TYPE, null);
am.getAuthToken(aGoogleAccount, MY_AUTH_TOKEN_TYPE, null, this, 
    new OnTokenAcquired(), new Handler(new OnError()));

然后按照后面的代码示例进行检查:

private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
@Override
    public void run(AccountManagerFuture<Bundle> result) {
        Bundle bundle = result.getResult();
        ...
        Intent launch = (Intent) bundle.get(AccountManager.KEY_INTENT);
        if (launch != null) {
            startActivityForResult(launch, 0);
            return;
        }
    }
}

我从未得到过KEY_INTENT。我理解以下内容:

  

验证者返回Intent可能有很多原因。这可能是用户首次登录此帐户。也许用户的帐户已过期,他们需要再次登录,或者他们存储的凭据可能不正确。也许该帐户需要双因素身份验证,或者需要激活相机才能进行视网膜扫描。理由是什么并不重要。如果你想要一个有效的令牌,那么你将不得不关闭Intent来获取它。

但是,getAuthToken始终会导致权限屏幕或登录屏幕出现在代码到达run方法之前,此时令牌有效。我试过了:

  1. 启用2步验证。在run之前请求帐户登录,因此请始终在run。{/ li>中添加令牌
  2. 更改服务器上的密码。在run之前再次请求帐户登录,因此始终在run
  3. 中设置令牌

    没有能力尝试视网膜扫描,所以有点不知所措。

    编辑1 我遇到的问题是,我可能会遇到一个KEY_INTENT的情况,所以我宁愿现在测试这段代码路径,而不是当它出现时该领域。

    提前致谢。

    彼得。

3 个答案:

答案 0 :(得分:4)

有机会在项目上做类似的事情。这与您的代码并不完全相同,我仍然说回调文档有太多'maybes'可以确定它应该如何工作,但是如果您使用this method传递false { {1}},如果您更改密码或启用2FA,您将获得重新登录屏幕的意图。这适用于ClientLogin,但应该与OAuth 2类似(不测试)。类似的东西:

notifyAuthFailure

答案 1 :(得分:1)

我认为您需要拨打getResult(),如下所示:

Intent launch = (Intent)result.getResult().get(AccountManager.KEY_INTENT);

答案 2 :(得分:0)

您正在使用getAuthToken版本,该版本使用Activity来调用访问授权提示。该版本的getAuthToken不返回intent,因为提供的活动用于启动相应的intent。如果要手动启动intent,请使用API​​级别14中不推荐使用的getAuthToken版本。有关详细信息,请参阅以下内容: http://developer.android.com/reference/android/accounts/AccountManager.html#getAuthToken%28android.accounts.Account,%20java.lang.String,%20boolean,%20android.accounts.AccountManagerCallback%3Candroid.os.Bundle%3E,%20android.os.Handler%29