Autoriser l'accès aux données utilisateur sur Android

L'authentification permet d'identifier une personne. On parle communément d'inscription ou de connexion d'utilisateur. L'autorisation est le processus d'attribution ou de refus de l'accès aux données ou aux ressources. Par exemple, votre application demande l'autorisation de l'utilisateur pour accéder à son Google Drive.

Les appels d'authentification et d'autorisation doivent être deux flux distincts en fonction des besoins du site ou de l'application.

Si votre application dispose de fonctionnalités qui peuvent utiliser les données de l'API Google, mais qui ne sont pas obligatoires dans le cadre des fonctionnalités de base de votre application, vous devez la concevoir pour pouvoir gérer efficacement les cas où les données de l'API ne sont pas accessibles. Par exemple, vous pouvez masquer une liste des fichiers récemment enregistrés lorsque l'utilisateur n'a pas accordé l'accès à Drive.

Vous ne devez demander l'accès aux champs d'application dont vous avez besoin pour accéder aux API Google que lorsque l'utilisateur effectue une action nécessitant l'accès à une API particulière. Par exemple, vous devez demander l'autorisation d'accéder au Drive de l'utilisateur chaque fois qu'il appuie sur un bouton "Enregistrer dans Drive".

En séparant l'autorisation de l'authentification, vous pouvez éviter de submerger les nouveaux utilisateurs ou de prêter à confusion quant aux raisons pour lesquelles certaines autorisations leur sont demandées.

Dans les services d'identité Google, l'authentification s'effectue à l'aide de SignInClient. Pour autoriser les actions nécessitant un accès aux données utilisateur stockées par Google, nous vous recommandons d'utiliser AuthorizationClient.

Demander les autorisations requises par les actions de l'utilisateur

Chaque fois qu'un utilisateur effectue une action nécessitant un champ d'application supplémentaire, appelez AuthorizationClient.authorize().

Par exemple, si un utilisateur effectue une action nécessitant l'accès à l'espace de stockage de son application Drive, procédez comme suit:

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build();
Identity.getAuthorizationClient(this)
        .authorize(authorizationRequest)
        .addOnSuccessListener(
            authorizationResult -> {
              if (authorizationResult.hasResolution()) {
                    // Access needs to be granted by the user
                PendingIntent pendingIntent = authorizationResult.getPendingIntent();
                try {
startIntentSenderForResult(pendingIntent.getIntentSender(),
REQUEST_AUTHORIZE, null, 0, 0, 0, null);
                } catch (IntentSender.SendIntentException e) {
                Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage());
                }
              } else {
            // Access already granted, continue with user action
                saveToDriveAppFolder(authorizationResult);
              }
            })
        .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

Dans le rappel onActivityResult de votre activité, vous pouvez vérifier si les autorisations requises ont bien été acquises et, le cas échéant, effectuer l'action utilisateur.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == MainActivity.REQUEST_AUTHORIZE) {
    AuthorizationResult authorizationResult = Identity.getAuthorizationClient(this).getAuthorizationResultFromIntent(data);
    saveToDriveAppFolder(authorizationResult);
  }
}