Autorizar o acesso aos dados do usuário do Google

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

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

Se o app tiver recursos que podem usar dados da API Google, mas que não são necessários como parte dos recursos principais, ele precisa ser projetado para ser capaz de processar casos em que os dados da API não estão acessíveis. Por exemplo, é possível 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 realizar uma ação que exija acesso a uma API específica. Por exemplo, você precisa solicitar permissão para acessar o Drive do usuário sempre que ele tocar no botão "Salvar no Drive".

Separando a autorização da autenticação, você evita sobrecarregar novos usuários ou confundir os usuários sobre por que eles estão sendo solicitados para determinadas permissões.

Para autenticação, recomendamos usar a API Credential Manager. Para autorizar ações que precisam de acesso aos dados do usuário armazenados pelo Google, recomendamos o uso do AuthorizationClient.

Solicitar permissões necessárias para ações do usuário

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

Por exemplo, se um usuário realizar uma ação que exija 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);
  }
}