Pular para o conteúdo
Voltar ao blog

Adicionando o OAuth2 do Gmail: um fluxo, dois provedores

4 min de leitura

Quando lançamos o OAuth2 da Microsoft na v1.2.0, o objetivo era claro: deixar as pessoas entrarem com a conta Microsoft que já têm, em vez de gerar uma senha de aplicativo. Funcionou bem para contas do Outlook, do Hotmail e do M365. O passo seguinte natural era o Gmail — o provedor de e-mail mais popular do mundo.

Por que o OAuth2 importa

Faz anos que o Google vem apertando o acesso ao IMAP. Se você tem 2FA ativado (e deveria ter), precisa de uma senha de aplicativo para usar clientes de e-mail de terceiros. Senhas de aplicativo funcionam, mas são obscuras, fáceis de esquecer e parecem uma gambiarra. O OAuth2 deixa a pessoa clicar em "Entrar com o Google", se autenticar no navegador e voltar para o aplicativo — sem senha copiada, sem procurar páginas de configuração.

A implementação

O MailVault já tinha um fluxo OAuth2 PKCE funcionando para a Microsoft, escrito em Rust. A arquitetura tem três partes: um servidor TCP local de retorno em localhost:19876, que recebe o redirecionamento depois do login no navegador; uma função de troca de tokens, que troca o código de autorização por tokens de acesso e de atualização; e a autenticação SASL XOAUTH2 para IMAP e SMTP.

Adicionar o Google significou tornar tudo isso agnóstico de provedor. Em vez de fixar os endpoints da Microsoft no código, refatoramos o módulo OAuth2 em Rust para aceitar a configuração do provedor em tempo de execução — URL de autorização, URL de token, escopos e client ID vêm todos do frontend quando o fluxo começa.

Para o ID de cliente, seguimos a mesma abordagem da Microsoft: usar um ID de cliente público bem conhecido. O Thunderbird, o cliente de e-mail de código aberto da Mozilla, registra clientes OAuth2 públicos tanto no Google quanto na Microsoft. O MailVault usa o ID de cliente Google do Thunderbird (406964657835-aq8lmia8j95dhl1a2bvharmfk3t1hgqj.apps.googleusercontent.com) com o escopo https://mail.google.com/, que dá acesso completo a IMAP e SMTP.

O que mudou no código

O lado Rust precisou de um novo comando oauth2_start, que aceita parâmetros específicos do provedor (URL de autorização, URL de token, escopos, ID de cliente) em vez de presumir a Microsoft. O servidor de retorno e a lógica do PKCE continuaram os mesmos — OAuth2 é OAuth2, seja qual for o provedor.

No frontend, o componente AccountModal agora mostra um botão "Entrar com o Google" para contas do Gmail (ao lado da alternativa "Usar senha de aplicativo", que continua existindo). O botão dispara o mesmo fluxo OAuth2, só que com os endpoints e os escopos do Google, em vez dos da Microsoft. Depois da autenticação, o token de acesso é usado com o SASL XOAUTH2 tanto no IMAP (imap.gmail.com) quanto no SMTP (smtp.gmail.com).

A renovação do token funciona igual à da Microsoft: quando um token de acesso expira (normalmente depois de uma hora), o MailVault o renova automaticamente usando o token de atualização guardado. A pessoa nunca precisa se autenticar de novo, a menos que revogue o acesso nas configurações da conta Google.

O resultado

Quem usa Gmail agora pode clicar em um botão, entrar pela página de login padrão do Google e começar a usar o MailVault na hora. Sem senhas de aplicativo, sem configurações de IMAP para descobrir, sem chaves de "aplicativos menos seguros". Funciona com 2FA, com o Google Workspace e com contas pessoais do Gmail.

A mesma infraestrutura de OAuth2 já está pronta para qualquer provedor futuro que ofereça OAuth2 padrão — o módulo em Rust é totalmente agnóstico de provedor.