Autoriza el acceso a los datos del usuario en Android

La autenticación establece quién es un usuario y, por lo general, se conoce como registro o acceso del usuario. La autorización es el proceso de otorgar o rechazar el acceso a datos o recursos. Por ejemplo, la app solicita el consentimiento del usuario para acceder a su cuenta de Google Drive.

Las llamadas de autenticación y autorización deben ser dos flujos separados y distintos según las necesidades del sitio o la app.

Si tu app tiene funciones que pueden usar los datos de la API de Google, pero no son necesarias como parte de sus funciones principales, debes diseñarla para que pueda manejar correctamente los casos en los que no se pueda acceder a los datos de la API. Por ejemplo, puedes ocultar una lista de archivos guardados recientemente cuando el usuario no le otorgó acceso a Drive.

Debes solicitar acceso a los permisos que necesitas para acceder a las APIs de Google solo cuando el usuario realiza una acción que requiere acceso a una API en particular. Por ejemplo, debes solicitar permiso para acceder a la unidad de Drive del usuario cada vez que este presione el botón "Guardar en Drive".

Si separas la autorización de la autenticación, puedes evitar abrumar a los usuarios nuevos o confundir a los usuarios por el motivo por el que se les solicitan ciertos permisos.

En los servicios de identidad de Google, la autenticación se realiza mediante SignInClient. Para autorizar acciones que necesitan acceso a los datos del usuario almacenados por Google, recomendamos usar AuthorizationClient.

Solicitud de permisos que requieren las acciones del usuario

Cuando un usuario realice una acción que requiera un alcance adicional, llama a AuthorizationClient.authorize().

Por ejemplo, si un usuario realiza una acción que requiere acceso al almacenamiento de la app en Drive, haz lo siguiente:

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

En la devolución de llamada onActivityResult de tu actividad, puedes verificar si se adquirieron correctamente los permisos necesarios y, de ser así, realizar la acción del usuario.

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