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