繁体   English   中英

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

[英]Never get AccountManager.KEY_INTENT from getAuthToken request

在JellyBean设备上。

我正在关注请求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具有令牌。
  2. 更改服务器上的密码。 run之前再次请求帐户登录,因此始终在run具有令牌。

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

编辑1我遇到的问题是可能存在一个我将获得KEY_INTENT ,所以我宁愿现在测试这个代码路径,而不是当它在现场时。

提前致谢。

彼得。

有机会在项目上做类似的事情。 这与你的代码并不完全相同,我仍然说回调文档有太多'maybes'来确定它应该如何工作,但是如果你使用这个方法notifyAuthFailure传递false ,你会得到一个意图如果您更改密码或启用2FA,则重新登录屏幕。 这适用于ClientLogin,但应该与OAuth 2类似(不测试)。 就像是:

// using Calendar ClientLogin for simplicity
Bundle authResult = am.getAuthToken(account, "cl", false, null, null).getResult();
if (authResult.containsKey(AccountManager.KEY_INTENT)) {
  Intent authIntent = authResult.getParcelable(AccountManager.KEY_INTENT);
  // start activity or show notification
}

我想你需要调用getResult() ,如下所示:

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

您正在使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM