Recherche…


Service d'authentification de compte de base

Le système d'authentification de compte Android peut être utilisé pour authentifier le client avec un serveur distant. Trois informations sont requises:

  • Un service, déclenché par android.accounts.AccountAuthenticator . Sa méthode onBind devrait renvoyer une sous-classe de AbstractAccountAuthenticator .
  • Une activité pour demander à l'utilisateur des informations d'identification (activité de connexion)
  • Un fichier de ressources xml pour décrire le compte

1. Le service:

Placez les autorisations suivantes dans votre fichier AndroidManifest.xml:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

Déclarez le service dans le fichier manifeste:

<service android:name="com.example.MyAuthenticationService">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data
        android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>

Notez que android.accounts.AccountAuthenticator est inclus dans la balise intent-filter . La ressource xml (nommée authenticator ici) est spécifiée dans la balise meta-data .

La classe de service:

public class MyAuthenticationService extends Service {

    private static final Object lock = new Object();
    private MyAuthenticator mAuthenticator;

    public MyAuthenticationService() {
        super();
    }

    @Override
    public void onCreate() {
        super.onCreate();

        synchronized (lock) {
            if (mAuthenticator == null) {
                mAuthenticator = new MyAuthenticator(this);
            }
        }
    }

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

}

2. La ressource xml:

<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="com.example.account"
    android:icon="@drawable/appicon"
    android:smallIcon="@drawable/appicon"
    android:label="@string/app_name" />

N'attribuez pas directement une chaîne à android:label ou attribuez des tirables manquants. Il va planter sans avertissement.

3. Étendez la classe AbstractAccountAuthenticator:

public class MyAuthenticator extends AbstractAccountAuthenticator {

    private Context mContext;

    public MyAuthenticator(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public Bundle addAccount(AccountAuthenticatorResponse response,
                             String accountType,
                             String authTokenType,
                             String[] requiredFeatures,
                             Bundle options) throws NetworkErrorException {

        Intent intent = new Intent(mContext, LoginActivity.class);
        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);

        Bundle bundle = new Bundle();
        bundle.putParcelable(AccountManager.KEY_INTENT, intent);

        return bundle;
    }

    @Override
    public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
        return null;
    }

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

    @Override
    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
        return null;
    }

    @Override
    public String getAuthTokenLabel(String authTokenType) {
        return null;
    }

    @Override
    public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
        return null;
    }

    @Override
    public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
        return null;
    }
}

La méthode addAccount() de la classe AbstractAccountAuthenticator est importante car cette méthode est appelée lors de l'ajout d'un compte à partir de l'écran "Ajouter un compte" dans les paramètres sous. AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE est important, car il inclura l'objet AccountAuthenticatorResponse nécessaire pour renvoyer les clés du compte lors de la vérification de l'utilisateur.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow