Vai al contenuto
Torna al blog

Aggiungere OAuth2 per Gmail: un solo flusso, due provider

4 min di lettura

Quando abbiamo rilasciato OAuth2 per Microsoft nella v1.2.0 l'obiettivo era chiaro: permettere agli utenti di accedere con il loro account Microsoft invece di generare una password per app. Ha funzionato bene per gli account Outlook, Hotmail e M365. Il passo successivo naturale era Gmail — il provider di posta più diffuso al mondo.

Perché OAuth2 conta

Google stringe l'accesso a IMAP da anni. Se hai la 2FA attiva (e dovresti averla), ti serve una password per app per usare client di posta di terze parti. Le password per app funzionano, ma sono oscure, facili da dimenticare e hanno il sapore di un ripiego. OAuth2 permette invece all'utente di fare clic su "Accedi con Google", autenticarsi nel browser e tornare nell'app — nessuna password copiata, nessuna pagina di impostazioni da cercare.

L'implementazione

MailVault aveva già un flusso OAuth2 PKCE funzionante per Microsoft, scritto in Rust. L'architettura ha tre parti: un server TCP di callback locale su localhost:19876 che riceve il redirect dopo l'accesso dal browser, una funzione di scambio che converte il codice di autorizzazione in token di accesso e di aggiornamento, e l'autenticazione SASL XOAUTH2 per IMAP e SMTP.

Aggiungere Google voleva dire rendere tutto questo indipendente dal provider. Invece di scrivere fissi gli endpoint di Microsoft, abbiamo rifattorizzato il modulo OAuth2 in Rust perché accetti la configurazione del provider a runtime — URL di autorizzazione, URL del token, scope e client ID arrivano tutti dal frontend quando si avvia il flusso.

Per il client ID abbiamo seguito lo stesso approccio usato per Microsoft: usare un client ID pubblico e noto. Thunderbird, il client di posta open source di Mozilla, registra client OAuth2 pubblici sia presso Google sia presso Microsoft. MailVault usa il client ID Google di Thunderbird (406964657835-aq8lmia8j95dhl1a2bvharmfk3t1hgqj.apps.googleusercontent.com) con lo scope https://mail.google.com/, che concede accesso completo a IMAP e SMTP.

Che cosa è cambiato nel codice

Sul lato Rust serviva un nuovo comando oauth2_start che accettasse parametri specifici del provider (URL di autorizzazione, URL dei token, scope, client ID) invece di dare per scontato Microsoft. Il server di callback e la logica PKCE sono rimasti gli stessi — OAuth2 è OAuth2, qualunque sia il provider.

Sul frontend il componente AccountModal mostra ora un pulsante "Accedi con Google" per gli account Gmail (accanto al ripiego già presente "Usa invece una password per app"). Il pulsante avvia lo stesso flusso OAuth2, solo con gli endpoint e gli scope di Google al posto di quelli di Microsoft. Dopo l'autenticazione, il token di accesso viene usato con SASL XOAUTH2 sia per IMAP (imap.gmail.com) sia per SMTP (smtp.gmail.com).

L'aggiornamento del token funziona in modo identico a Microsoft: quando un token di accesso scade (di norma dopo un'ora), MailVault lo rinnova automaticamente usando il token di aggiornamento salvato. L'utente non deve mai autenticarsi di nuovo, a meno che non revochi l'accesso dalle impostazioni del suo account Google.

Il risultato

Chi usa Gmail ora può fare clic su un pulsante, accedere dalla normale pagina di login di Google e iniziare subito a usare MailVault. Niente password per app, nessuna impostazione IMAP da cercare, nessun interruttore per le "app meno sicure". Funziona con la 2FA, con Google Workspace e con gli account Gmail personali.

La stessa infrastruttura OAuth2 è ora pronta per qualsiasi provider futuro che supporti OAuth2 standard — il modulo Rust è completamente indipendente dal provider.