🚀 6.6 Escopos e Consentimento OAuth 2.0
O acesso a dados sensíveis, como a agenda de um usuário, é regido pelo protocolo OAuth 2.0. No Android moderno, facilitamos esse processo através de Escopos (Scopes), que definem exatamente quais “portas” seu aplicativo tem permissão para abrir.
O Que São Escopos?
Um escopo é uma String que identifica um recurso. Para o Google Calendar, os principais são:
CalendarScopes.CALENDAR_READONLY: Apenas leitura.CalendarScopes.CALENDAR: Leitura e escrita (o que utilizaremos no BoaViagem).
Fluxo de Consentimento GMS
Diferente do passado, onde usávamos o AccountManager de forma complexa, o Google Play Services apresenta a tela de consentimento automaticamente quando você solicita o escopo no login:
// Configurando a solicitação de autorização
var gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestScopes(new Scope(CalendarScopes.CALENDAR))
.build();Verificação de Autorização em Tempo de Execução
Mesmo que o usuário esteja logado, ele pode ter negado o acesso específico à Agenda. Sempre verifique se o escopo foi concedido antes de tentar uma operação:
private void verificarAutorizacaoAgenda() {
var conta = GoogleSignIn.getLastSignedInAccount(this);
if (conta != null && GoogleSignIn.hasPermissions(conta, new Scope(CalendarScopes.CALENDAR))) {
// Autorização confirmada! Seguir para criação de eventos.
registrarViagemNaAgenda();
} else {
// Solicita autorização adicional
GoogleSignIn.requestPermissions(
this,
RC_AUTHORIZE_CALENDAR,
conta,
new Scope(CalendarScopes.CALENDAR)
);
}
}IMPORTANT
Segurança por Design: Nunca peça todos os escopos de uma vez se não for usá-los imediatamente. A Engenharia Premium preza pela “Autorização Incremental”: peça apenas o login básico no início e o acesso à Agenda apenas quando o usuário salvar uma viagem.
TIP
No Java 17, a manipulação de escopos e verificações de conta é atômica e segura. O uso do
GoogleSignIn.hasPermissions()evita que seu app lance exceções de “403 Forbidden” ao tentar acessar a API sem o devido consentimento.