AbstractAccountAuthenticator getAuthToken не вызывается

Я использую пользовательскую реализацию AbstractAccountAuthenticator и реализовал getAuthToken в соответствии с документацией. Я следовал этому руководству: http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/

Однако я не понимаю, когда вызывается метод getAuthToken, который находится в реализации AbstractAccountAuthenticator. Я настроил его в манифесте с созданной мной службой, которая его реализует, создал страницу входа и может добавлять учетные записи, добавлять токены и получать токены из моего кода в действиях с использованием класса AccountManager, но нигде в документации не объясняется, когда Вызывается код AbstractAccountAuthenticator.

Может ли кто-нибудь помочь мне понять, почему мне пришлось реализовать аутентификатор, когда он, похоже, не используется.


person Richard Mannion    schedule 14.08.2016    source источник


Ответы (3)


Это потому, что между вашим приложением и вашим аутентификатором есть посредник, и это класс Android AccountManager.

Ваш аутентификатор на самом деле является «плагином» для типа учетной записи, с которым он связан; он может использоваться не только вашим приложением, но и любым другим приложением, которому требуется аутентификация для конкретного типа учетной записи, которую обрабатывает ваш аутентификатор.

Поэтому, когда вы настраиваете свой аутентификатор в манифесте своего приложения, этот аутентификатор регистрируется в AccountManager. Теперь, если приложение проходит аутентификацию с типом учетной записи "com.google", AccountManager будет использовать предварительно зарегистрированный аутентификатор Google. Если он аутентифицируется с типом учетной записи «com.yourapp.account», AccountManager вместо этого будет использовать ваш аутентификатор.

Ваше приложение запрашивает у AccountManager токен аутентификации, и оно разворачивается и перенаправляет запрос вашему аутентификатору.

Перечитайте статью Удини. Примеры кода демонстрируют, как все это сочетается друг с другом.

person kris larson    schedule 14.08.2016
comment
Спасибо за ответ, я так и думал, но это все еще не работает так, как я ожидал. Почему, когда я ставлю точку останова, она никогда не срабатывает? Я каким-то образом обхожу код, который написал, когда использую GetAuthToken AccountManagers? - person Richard Mannion; 15.08.2016
comment
AccountManager решает, когда ему нужно использовать ваш аутентификатор. Если ваш код не вызывается, возможно, это связано с тем, что AccountManager уже имеет токен, который он считает действительным. Если вы пытаетесь запустить getAuthToken на аутентификаторе, попробуйте сначала вызвать invalidateAuthToken на AccountManager. В блоге Удини есть неприятная блок-схема, иллюстрирующая все взаимодействие. - person kris larson; 15.08.2016

в 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, будет вызван метод.

person ududx    schedule 16.01.2019

Установка android:customTokens="true" в файле authentication.xml позволила вызвать метод getAuthToken в моей реализации класса abstractaccountauthenticator.

person ANANTHARAMAN P    schedule 23.02.2020