OAuth 2.0: cos'è e come funziona il protocollo di autorizzazione

Autore: IT Sectr Pubblicato: 2026-04-05 Tempo di lettura: 10 min

OAuth 2.0 è un protocollo di autorizzazione standard del settore che fornisce ad applicazioni terze accesso limitato alle risorse dell'utente senza condividere le sue credenziali. Il protocollo è diventato lo standard de facto per l'autorizzazione delegata in applicazioni web e mobili, utilizzato da piattaforme come Google, Facebook, Apple e GitHub. Secondo IETF RFC 6749 (2025), OAuth 2.0 è utilizzato in oltre l'85% di tutte le integrazioni API che richiedono accesso delegato ai dati.

Punti chiave

  • OAuth 2.0 è un protocollo di autorizzazione delegata che consente a un'applicazione di accedere alle risorse dell'utente senza trasmettere una password (IETF RFC 6749)
  • Access Token è un token di accesso temporaneo rilasciato dal server di autorizzazione all'applicazione dopo l'autenticazione riuscita dell'utente
  • Authorization Code Flow è il Grant Type più sicuro per le applicazioni mobili, che utilizza un code challenge (PKCE) per proteggersi dall'intercettazione
  • Refresh Token è un token di lunga durata per ottenere nuovi Access Token senza richiedere all'utente di accedere nuovamente
  • AppAuth è la libreria raccomandata dall'IETF per implementare OAuth 2.0 in applicazioni mobili native su Android e iOS

Cos'è OAuth 2.0?

OAuth 2.0 è un protocollo di autorizzazione definito in IETF RFC 6749 che consente ad applicazioni terze di ottenere accesso limitato alle risorse di un utente senza rivelare il suo nome utente e password. Il protocollo risolve un problema fondamentale del modello basato su password: un'applicazione a cui affidi la tua password ottiene accesso illimitato a tutti i dati dell'account. OAuth 2.0 sostituisce questo approccio emettendo un token temporaneo con un ambito di accesso esplicitamente limitato.

L'architettura di OAuth 2.0 è l'autorizzazione delegata. L'utente (Resource Owner) autorizza un'applicazione (Client) ad accedere ai propri dati memorizzati su un server di risorse (Resource Server) attraverso un intermediario: il server di autorizzazione (Authorization Server). Il server di autorizzazione emette un Access Token, una stringa crittografica che l'applicazione presenta al server di risorse per accedere ai dati. Una differenza importante tra OAuth 2.0 e SAML o OpenID Connect: OAuth 2.0 risolve il compito di autorizzazione (cosa è permesso), non l'autenticazione (chi è l'utente). Per l'autenticazione su OAuth 2.0 viene costruito il protocollo OpenID Connect (OIDC).

Il protocollo è supportato da tutte le principali piattaforme. Google utilizza OAuth 2.0 per accedere alle Google APIs (Gmail, Drive, Calendar), Facebook per Graph API, Apple per Sign in with Apple (ASAuthorizationAppleIDProvider) e GitHub per l'accesso ai repository. Nel contesto dello sviluppo mobile, OAuth 2.0 è il meccanismo standard per integrare servizi di terze parti: login tramite social network, accesso all'archiviazione cloud e pubblicazione di contenuti per conto dell'utente.

Ruoli e componenti di OAuth 2.0

Il protocollo OAuth 2.0 definisce quattro ruoli la cui interazione forma il ciclo completo di autorizzazione. Comprendere ogni ruolo è essenziale per implementare correttamente il protocollo in un'applicazione mobile.

I quattro ruoli del protocollo

RuoloDescrizioneEsempio
Resource OwnerIl proprietario dei dati: l'utente che concede l'accesso alle proprie risorseUn utente dell'applicazione che clicca su “Accedi con Google”
ClientL'applicazione che richiede l'accesso alle risorse per conto del proprietarioUn'applicazione mobile che necessita di accedere a Google Drive
Authorization ServerIl server che emette token dopo autenticazione e autorizzazioneaccounts.google.com: il server di autorizzazione di Google
Resource ServerL'API che fornisce accesso alle risorse protette tramite tokenwww.googleapis.com: il server di risorse dell'API Google Drive

Le entità chiave del protocollo sono l'Access Token, il Refresh Token e l'Authorization Code. L'Access Token è un token di breve durata (solitamente 15–60 minuti) presentato al server di risorse ad ogni richiesta di dati. Il Refresh Token è un token di lunga durata (giorni o settimane) utilizzato per ottenere un nuovo Access Token senza che l'utente debba riaccedere. L'Authorization Code è un codice temporaneo emesso dopo l'autorizzazione dell'utente e scambiato con un Access Token e Refresh Token.

Grant Types: scenari di autorizzazione

OAuth 2.0 definisce diversi Grant Types, scenari di ottenimento del token, ciascuno progettato per un tipo specifico di client e contesto di sicurezza. Scegliere il Grant Type corretto è una decisione architettonica critica nella progettazione dell'autorizzazione in un'applicazione mobile.

I principali Grant Types sono: Authorization Code (il più sicuro per applicazioni mobili e web con componente server), Authorization Code con PKCE (Proof Key for Code Exchange: per applicazioni mobili e SPA senza backend server), Client Credentials (per autenticazione server-to-server senza partecipazione dell'utente) e Resource Owner Password Credentials (deprecato: trasmette la password direttamente). PKCE è un'estensione obbligatoria per client pubblici (applicazioni mobili, SPA) secondo le raccomandazioni di OAuth Security BCP (RFC 9700).

Principali Grant Types

  • Authorization Code + PKCE è il Grant Type raccomandato per applicazioni mobili native. Il client genera un code_verifier crittografico, calcola un code_challenge (hash SHA-256) e il server verifica la corrispondenza durante lo scambio del codice per un token. Ciò impedisce l'intercettazione dell'authorization code tra l'applicazione e il server
  • Client Credentials viene utilizzato per autorizzazione machine-to-machine dove il client è noto e autenticato. L'applicazione ottiene un token usando il proprio client_id e client_secret. Non richiede partecipazione dell'utente. Scenario tipico: un'applicazione server chiama un'API per l'elaborazione batch di dati
  • Device Authorization Grant è per dispositivi senza browser (Smart TV, IoT). L'utente segue un link su un altro dispositivo e inserisce un codice. Utilizzato, ad esempio, durante l'autorizzazione di Netflix su un televisore tramite smartphone
  • Resource Owner Password Credentials è un Grant Type deprecato vietato da OAuth Security BCP. La password viene trasmessa direttamente al client, violando il principio di autenticazione a conoscenza zero. Utilizzato solo per la migrazione da sistemi legacy

Authorization Code Flow con PKCE per applicazioni mobili

Authorization Code Flow con PKCE è la configurazione raccomandata di OAuth 2.0 per applicazioni mobili native. PKCE (Proof Key for Code Exchange) aggiunge un ulteriore strato di protezione che previene gli attacchi di intercettazione dell'authorization code. Il protocollo è descritto in IETF RFC 7636.

Sequenza passo-passo di PKCE

La sequenza dei passaggi: (1) il client genera un code_verifier casuale (una stringa di 43–128 caratteri che utilizza solo caratteri non riservati), (2) il client calcola code_challenge = SHA-256(code_verifier), (3) il client apre un browser per l'autorizzazione dell'utente sull'Authorization Server, passando code_challenge, (4) dopo autorizzazione riuscita, il server restituisce l'authorization code all'applicazione tramite uno schema URI personalizzato (deep link dell'app), (5) il client invia authorization code + code_verifier al server, (6) il server verifica SHA-256(code_verifier) === code_challenge ed emette un Access Token + Refresh Token.

Il vantaggio di PKCE: anche se un utente malintenzionato intercetta l'authorization code nello schema URI, non può scambiarlo per un token senza il code_verifier, che è noto solo al client legittimo. Nelle applicazioni mobili, per aprire il browser è opportuno utilizzare Chrome Custom Tabs (Android) o ASWebAuthenticationSession (iOS); ciò garantisce che il browser di sistema non possa accedere al code_verifier dalla memoria dell'applicazione.

Implementazione di OAuth 2.0 su Android tramite AppAuth

AppAuth è l'implementazione di riferimento di OAuth 2.0 e OpenID Connect per applicazioni native, raccomandata dall'IETF. La libreria supporta PKCE, Chrome Custom Tabs, schemi URI personalizzati per restituire l'authorization code e l'aggiornamento automatico dei token. AppAuth per Android è disponibile tramite la dipendenza `net.openid:appauth:0.11.1`.

kotlin
val serviceConfig = AuthorizationServiceConfiguration.fromUrl(
    Uri.parse("https://accounts.google.com/.well-known/openid-configuration")
)

val request = AuthorizationRequest.Builder(
    serviceConfig,
    "CLIENT_ID.apps.googleusercontent.com",
    ResponseTypeValues.CODE,
    Uri.parse("com.example.app:/oauth2callback")
)
.setScope("openid profile email")
.setCodeVerifier(
    CodeVerifierUtil.generateRandomCodeVerifier()
)
.build()

val authService = AuthorizationService(context)
val intent = authService.getAuthorizationRequestIntent(request)

// Avviare Chrome Custom Tab per l'autorizzazione
startActivityForResult(intent, REQUEST_CODE_AUTH)

Dopo aver ricevuto l'authorization code (onActivityResult), l'applicazione lo scambia per un Access Token e Refresh Token tramite un TokenRequest. I token vengono salvati in SharedPreferences con crittografia tramite EncryptedSharedPreferences (Android Security Crypto). Il Refresh Token deve essere memorizzato nel KeyStore, un archivio di chiavi hardware inaccessibile ad altre applicazioni. Ogni volta che l'Access Token scade, l'applicazione utilizza il Refresh Token per ottenerne uno nuovo: l'utente non deve autenticarsi nuovamente.

kotlin
// Scambiare authorization code per token
val data = intent?.data ?: return
val resp = AuthorizationResponse.fromIntent(data)
val exchangeReq = resp?.createTokenExchangeRequest()
    ?: return

authService.performTokenRequest(
    exchangeReq,
    ClientAuthentication.none()
) { tokenResp, ex ->
    if (tokenResp != null) {
        // Access Token e Refresh Token ricevuti
        val accessToken = tokenResp.accessToken
        val refreshToken = tokenResp.refreshToken
        // Salvare in EncryptedSharedPreferences
        saveTokens(accessToken, refreshToken)
    }
}

Il codice sopra dimostra il flusso completo di OAuth 2.0 con PKCE: creazione della configurazione del server tramite OpenID Connect Discovery, generazione di una richiesta di autorizzazione con code_verifier, avvio di Chrome Custom Tab, ricezione dell'authorization code tramite uno schema URI personalizzato e scambio del codice per token tramite una TokenRequest. È importante gestire la scadenza dell'Access Token: quando si riceve una risposta HTTP 401 dal Resource Server, l'applicazione deve utilizzare il Refresh Token per ottenere un nuovo Access Token ed eseguire nuovamente la richiesta.

Sicurezza di OAuth 2.0: attacchi tipici e protezione

OAuth 2.0 è un protocollo complesso con molti vettori di attacco. IETF Security BCP (RFC 9700) descrive oltre 20 classi di vulnerabilità di OAuth 2.0. Per le applicazioni mobili, le più critiche sono: intercettazione dell'authorization code tramite schemi URI personalizzati, attacchi CSRF sugli endpoint di callback, furto del Refresh Token da archiviazioni non sicure e impersonificazione del client tramite intercettazione di intent.

La protezione contro questi attacchi include misure obbligatorie: (1) PKCE con code_challenge S256: previene l'intercettazione dell'authorization code anche se lo schema URI viene intercettato; (2) utilizzo di un parametro nonce o state per prevenire CSRF: il server verifica che l'authorization code corrisponda alla richiesta originale; (3) memorizzazione del Refresh Token solo nel KeyStore (Android) o Keychain (iOS): mai in SharedPreferences o UserDefaults; (4) utilizzo di TLS con Certificate Pinning per proteggersi da MITM a livello di trasporto; (5) validazione di redirect_uri: il server di autorizzazione deve validare rigorosamente la corrispondenza con l'URI registrato.

Raccomandazioni aggiuntive dell'IETF: le applicazioni mobili dovrebbero utilizzare AppAuth o librerie simili che hanno superato audit di sicurezza; non fare affidamento su WebView per OAuth (WebView non isola i dati dall'applicazione principale); implementare la rotazione automatica del Refresh Token (ogni Refresh Token può essere utilizzato una sola volta); aggiungere Certificate Pinning tramite TrustManager per Android e URLSession per iOS. OpenID Connect Discovery (endpoint well-known) aiuta a determinare automaticamente gli endpoint corretti del server di autorizzazione ed evitare reindirizzamenti a pagine di phishing.

Domande frequenti

Qual è la differenza tra OAuth 2.0 e OpenID Connect?

OAuth 2.0 è un protocollo di autorizzazione (cosa è permesso fare?), mentre OpenID Connect (OIDC) è un protocollo di autenticazione (chi è l'utente?). OIDC è costruito sopra OAuth 2.0 e aggiunge un ID Token, un token JWT contenente informazioni sull'identità dell'utente. OAuth 2.0 fornisce un Access Token, OIDC lo integra con un ID Token e un endpoint UserInfo per ottenere il profilo dell'utente.

Cos'è un Bearer Token e perché è pericoloso?

Un Bearer Token è un Access Token presentato nell'intestazione HTTP Authorization: Bearer. Il suo pericolo risiede nel fatto che chiunque possieda il token può accedere alla risorsa: il token non è legato al client. Pertanto, il Bearer Token deve essere trasmesso solo tramite TLS (HTTPS), avere una breve durata (15–60 minuti) e non essere mai memorizzato in log o parametri URL.

Perché PKCE è obbligatorio per le applicazioni mobili?

Le applicazioni mobili sono client pubblici che non hanno client_secret (un segreto non può essere protetto in un APK/IPA). Senza PKCE, un utente malintenzionato potrebbe intercettare l'authorization code tramite uno schema URI personalizzato (ad esempio, malformed://callback?code=ABC) e scambiarlo per un token. PKCE aggiunge un code_verifier noto solo all'applicazione, rendendo il codice intercettato inutile.

Con quale frequenza dovrebbe essere rinnovato l'Access Token?

Un Access Token tipico ha una durata di 15–60 minuti (configurabile sul server di autorizzazione). Ad ogni richiesta HTTP al Resource Server, la risposta viene verificata: se il codice è 401, l'applicazione attiva il Refresh Token Flow per ottenere un nuovo Access Token. Il Refresh Token vive da 24 ore a diversi mesi, a seconda della politica di sicurezza del fornitore. Quando il Refresh Token cambia, quello vecchio viene invalidato.

Si può usare WebView per OAuth 2.0?

No: IETF Security BCP (RFC 9700) vieta WebView per OAuth 2.0 nelle applicazioni mobili. WebView non isola cookie e dati dall'applicazione principale, consentendo all'applicazione di intercettare le credenziali dell'utente. Invece di WebView, utilizzare Chrome Custom Tabs (Android) o ASWebAuthenticationSession (iOS): componenti del browser di sistema isolati dall'applicazione.

Riepilogo

  • OAuth 2.0 è un protocollo di autorizzazione delegata (IETF RFC 6749) che sostituisce la trasmissione della password con token temporanei con ambito di accesso limitato
  • Authorization Code + PKCE è il Grant Type obbligatorio per applicazioni mobili che protegge dall'intercettazione dell'authorization code tramite schemi URI
  • Access Token è un token di breve durata (15–60 minuti) presentato al Resource Server ad ogni richiesta di dati
  • Refresh Token è un token di lunga durata per il rinnovo continuo dell'Access Token senza che l'utente riacceda
  • AppAuth è la libreria di riferimento OAuth 2.0 per Android e iOS con supporto per PKCE, Custom Tabs e KeyStore
  • WebView è vietato: OAuth 2.0 deve essere eseguito tramite il browser di sistema (Custom Tabs / ASWebAuthenticationSession) secondo IETF RFC 9700
  • OpenID Connect è un protocollo di autenticazione su OAuth 2.0 che aggiunge un ID Token (JWT) per l'identificazione dell'utente

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche