Android Comprendre les comptes / authentifications personnalisés


Exemple

L'exemple suivant est une couverture de haut niveau des concepts clés et de la configuration squelettique de base: -

  1. Collecte les informations d'identification de l'utilisateur (généralement à partir d'un écran de connexion que vous avez créé)
  2. Authentifie les informations d'identification avec le serveur (stocke l'authentification personnalisée)
  3. Stocke les informations d'identification sur le périphérique

Étendre un AbstractAccountAuthenticator (principalement utilisé pour récupérer l'authentification et les ré-authentifier)

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.
  }
}

Créer un service (la structure Account Manager se connecte à AbstractAccountAuthenticator étendu via l'interface de service)

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();
    }
}


Configuration XML de l'authentificateur (la structure du gestionnaire de compte est requise. C'est ce que vous verrez dans Paramètres -> Comptes dans 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" />

Modifications apportées à AndroidManifest.xml ( réunissez tous les concepts ci-dessus pour le rendre utilisable par programme via le 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>

L'exemple suivant contiendra comment utiliser cette configuration.