A autenticação estabelece quem é alguém e é conhecida como inscrição ou login do usuário. Autorização é o processo de conceder ou rejeitar o acesso a dados ou recursos. Por exemplo, o aplicativo solicita o consentimento do usuário para acessar o Google Drive do usuário.
As chamadas de autenticação e autorização precisam ser dois fluxos separados e distintos, de acordo com as necessidades do site ou app.
Caso seu app tenha recursos que usem dados da API do Google, mas não sejam necessários como parte dos recursos principais dele, crie um app que possa processar os casos em que os dados da API não estão acessíveis. Por exemplo, você poderá ocultar uma lista de arquivos salvos recentemente quando o usuário não tiver concedido 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 Drive".
Ao separar a autorização da autenticação, você pode evitar sobrecarregar novos usuários ou confundir os usuários em relação ao motivo da solicitação 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 aos dados do usuário armazenados pelo Google, recomendamos o uso de AuthorizationClient.
Como solicitar permissões exigidas por ações do usuário
Sempre que um usuário executar uma ação que exija escopo extra, chame
AuthorizationClient.authorize()
.
Por exemplo, se um usuário executar 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(builder.build())
.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);
}
}