【问题标题】:AbstractAccountAuthenticator getAuthToken not being calledAbstractAccountAuthenticator getAuthToken 未被调用
【发布时间】:2016-12-21 01:34:46
【问题描述】:

我正在使用 AbstractAccountAuthenticator 的自定义实现,并且我已经按照文档实现了 getAuthToken。我一直在关注这个教程:http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/

但是,我不明白什么时候调用了 AbstractAccountAuthenticator 实现中的 getAuthToken 方法。我已经在清单中使用我创建的实现它的服务进行了设置,创建了登录页面,并且可以使用 AccountManager 类从我的活动代码中添加帐户、添加令牌和获取令牌,但任何文档中都没有说明何时调用 AbstractAccountAuthenticator 代码。

有人可以帮我理解为什么我必须在似乎没有使用身份验证器的情况下实施它。

【问题讨论】:

    标签: android token accountmanager


    【解决方案1】:

    那是因为在您的应用程序和您的身份验证器之间有一个中介,它是 Android 的 AccountManager 类。

    您的身份验证器实际上是与其关联的帐户类型的“插件”;它不仅可以由您的应用程序使用,还可以由任何其他需要对您的身份验证器处理的特定帐户类型进行身份验证的应用程序使用。

    因此,当您在应用清单中设置身份验证器时,该身份验证器会注册到 AccountManager。现在,如果应用使用“com.google”帐户类型进行身份验证,AccountManager 将使用 Google 的预注册身份验证器。如果它使用“com.yourapp.account”的帐户类型进行身份验证,AccountManager 将使用您的身份验证器。

    您的应用向AccountManager 请求身份验证令牌,然后它转身将请求转发给您的身份验证器。

    重读 Udini 的文章。代码示例演示了它们是如何组合在一起的。

    【讨论】:

    • 感谢您的回复,这就是我的想法,但它似乎仍然没有按我预期的方式工作。为什么当我设置断点时它永远不会被击中?我是否以某种方式绕过了我在使用 AccountManagers GetAuthToken 时编写的代码?
    • AccountManager 决定何时需要使用您的身份验证器。如果您的代码没有被调用,可能是因为AccountManager 已经有一个它认为有效的令牌。如果您试图让getAuthToken 在身份验证器上运行,请先尝试在AccountManager 上调用invalidateAuthToken。 Udini 的博客中有一个令人讨厌的流程图来说明整个交互。
    【解决方案2】:

    在 AuthenticatorActivity.java 中

    private void finishLogin(Intent intent) {
        Log.d("udinic", TAG + "> finishLogin");
    
        String accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        String accountPassword = intent.getStringExtra(PARAM_USER_PASS);
        final Account account = new Account(accountName, intent.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
    
        if (getIntent().getBooleanExtra(ARG_IS_ADDING_NEW_ACCOUNT, false)) {
            Log.d("udinic", TAG + "> finishLogin > addAccountExplicitly");
            String authtoken = intent.getStringExtra(AccountManager.KEY_AUTHTOKEN);
            String authtokenType = mAuthTokenType;
    
            // Creating the account on the device and setting the auth token we got
            // (Not setting the auth token will cause another call to the server to authenticate the user)
            mAccountManager.addAccountExplicitly(account, accountPassword, null);
            mAccountManager.setAuthToken(account, authtokenType, authtoken);
        } else {
            Log.d("udinic", TAG + "> finishLogin > setPassword");
            mAccountManager.setPassword(account, accountPassword);
        }
    
        setAccountAuthenticatorResult(intent.getExtras());
        setResult(RESULT_OK, intent);
        finish();
    }
    

    mAccountManager.setAuthToken(account, authtokenType, authtoken); 已设置令牌。您可以删除该行,并添加一个新帐户,然后调用getAuthToken,该方法将被调用。

    【讨论】:

      【解决方案3】:

      在authenticator.xml 中设置android:customTokens="true" 可以在我的abstractaccountauthenticator 类的实现中调用getAuthToken 方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        • 2019-02-07
        • 2016-05-21
        • 2012-02-15
        相关资源
        最近更新 更多