Android Comprendere account / autenticazione personalizzati


Esempio

L'esempio seguente è una copertura di alto livello dei concetti chiave e della configurazione scheletrica di base:

  1. Raccoglie le credenziali dall'utente (solitamente da una schermata di accesso che hai creato)
  2. Autentica le credenziali con il server (memorizza l'autenticazione personalizzata)
  3. Memorizza le credenziali sul dispositivo

Estendi un abstractAccountAuthenticator (utilizzato principalmente per recuperare l'autenticazione e riattivarli)

public class AccountAuthenticator extends AbstractAccountAuthenticator {

  @Override
  public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
      String authTokenType, String[] requiredFeatures, Bundle options) {
    //intent to start the login activity
  }


  @Override
  public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) {
  }

  @Override
  public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
  }

  @Override
  public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType,
      Bundle options) throws NetworkErrorException {
    //retrieve authentication tokens from account manager storage or custom storage or re-authenticate old tokens and return new ones
  }

  @Override
  public String getAuthTokenLabel(String authTokenType) {
  }

  @Override
  public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features)
      throws NetworkErrorException {
    //check whether the account supports certain features
  }

  @Override
  public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType,
      Bundle options) {
    //when the user's session has expired or requires their previously available credentials to be updated, here is the function to do it.
  }
}

Creare un servizio (il framework di Account Manager si connette al AbstractAccountAuthenticator esteso tramite l'interfaccia del servizio)

public class AuthenticatorService extends Service {

    private AccountAuthenticator authenticator;

    @Override
    public void onCreate(){
        authenticator = new AccountAuthenticator(this);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return authenticator.getIBinder();
    }
}


Configurazione XML dell'autenticatore (il framework del gestore dell'account richiede. Questo è ciò che vedrai in Impostazioni -> Account in Android)

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="rename.with.your.applicationid"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
    android:smallIcon="@drawable/app_icon" />

Modifiche a AndroidManifest.xml (riunisci tutti i concetti di cui sopra per renderlo utilizzabile programmaticamente tramite l'AccountManager)

<application
...>
    <service
        android:name=".authenticator.AccountAuthenticatorService"
        android:exported="false"
        android:process=":authentication">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator"/>
        </intent-filter>
        <meta-data
            android:name="android.accounts.AccountAuthenticator"
            android:resource="@xml/authenticator"/>
    </service>
</application>

Il prossimo esempio conterrà come utilizzare questa impostazione.