Autorizar o acesso aos dados do usuário no Android

A autenticação estabelece quem é alguém e é comumente chamada de inscrição ou login de usuário. Autorização é o processo de conceder ou rejeitar o acesso a dados ou recursos. Por exemplo, seu app solicita o consentimento do usuário para acessar o Google Drive.

As chamadas de autenticação e autorização precisam ser dois fluxos separados e distintos com base nas necessidades do site ou app.

Se o app tiver recursos que podem usar dados da API do Google, mas que não sejam necessários como parte dos principais recursos, crie seu app para processar casos em que os dados da API não estiverem acessíveis. Por exemplo, você pode ocultar uma lista de arquivos salvos recentemente quando o usuário não concedeu acesso ao Drive.

Solicite acesso aos escopos necessários para acessar as APIs do Google somente quando o usuário executar uma ação que exija acesso a uma API específica. Por exemplo, solicite permissão para acessar o Drive do usuário sempre que ele tocar no botão "Salvar no Google Drive".

Ao separar a autorização da autenticação, você pode evitar sobrecarregar novos usuários ou confundir os usuários quanto ao motivo de precisarem de determinadas permissões.

Nos Serviços de identidade do Google, a autenticação é feita usando o SignInClient. Para autorizar ações que precisam de acesso a dados do usuário armazenados pelo Google, recomendamos o uso de AuthorizationClient.

Como solicitar permissões exigidas pelas ações do usuário

Sempre que um usuário realizar uma ação que exija escopo adicional, chame AuthorizationClient.authorize().

Por exemplo, se um usuário executar uma ação que requer acesso ao armazenamento do app Drive, faça o seguinte:

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

No callback onActivityResult da atividade, é possível verificar se as permissões necessárias foram adquiridas e, em caso afirmativo, realizar a ação do usuário.

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