OAuth 2.0 è uno standard di autorizzazione che permette alle app di accedere a un account su un altro servizio: il login social si costruisce sopra. I due vengono quasi sempre spiegati separatamente, ed è così che la confusione sopravvive: la RFC 6749 definisce l’impianto (accesso delegato e delimitato da scope, senza condividere password), OpenID Connect aggiunge lo strato di identità, e il pulsante “Accedi con…” è la feature di prodotto che viaggia su entrambi.
Punti chiave
| Domanda | Risposta |
|---|---|
| OAuth 2.0 | Autorizzazione delegata: token delimitati da scope e con scadenza al posto delle password |
| La confusione | OAuth risponde a che cosa può accedere questa app – OIDC risponde chi è questo utente |
| Il flusso moderno | Authorization code + PKCE – i grant implicit e password sono spariti in 2.1 |
| I token | Access (breve, delimitato) · refresh (ruotato) · ID (claim di identità firmati) |
| Login social | OIDC in un pulsante: il provider autentica, l’app riceve claim verificati |
Il flusso authorization code, passo per passo
La danza dei redirect dietro ogni schermata di consenso – con i parametri che contano:
1 App → provider /authorize?client_id=…&redirect_uri=…&scope=profile
&state=af3G… ← guardia anti-CSRF, verificata al ritorno
&code_challenge=hK9… ← PKCE: hash di un segreto appena creato
2 Utente ↔ provider Accede LÀ (la password non tocca mai l'app), acconsente
3 Provider → app redirect_uri?code=SplxlO…&state=af3G… ← codice monouso
4 App → provider POST /token { code, code_verifier } ← prova PKCE
Provider → app { access_token, refresh_token, id_token }
5 App → API Authorization: Bearer <access_token>
Ecco che cosa diventa quando un backend lo avvolge – entrano i token del provider, esce una sessione verificata:
// JavaScript / Node.js — Back4app JS SDK
// Social login: the provider's tokens become a user session
const user = await Parse.User.logInWith('apple', {
authData: { id: appleUserId, token: identityToken },
});
// First login creates the user; later logins match — session token issued
// Account linking: attach a second provider to the same user
await user.linkWith('facebook', { authData: fbAuthData }); // Flutter / Dart — Back4app Flutter SDK
// Social login: the provider's tokens become a user session
final user = ParseUser.forQuery();
final response = await user.loginWith(
'apple',
apple(identityToken, appleUserId),
);
// First login creates the user; later logins match — session token issued
// Account linking: attach a second provider to the same user
await user.linkWith('facebook', facebook(token, fbUserId, expiresAt)); // iOS / Swift — Back4app Swift SDK
// Social login: the provider's tokens become a user session
let user = try await User.apple.login(
user: appleUserId,
identityToken: identityTokenData
)
// First login creates the user; later logins match — session token issued
// Account linking: attach a second provider to the same user
try await user.facebook.link(userId: fbUserId, accessToken: fbAccessToken) // Android / Kotlin — Back4app Android SDK
// Social login: the provider's tokens become a user session
val authData = mapOf("id" to appleUserId, "token" to identityToken)
ParseUser.logInWithInBackground("apple", authData).continueWith { task ->
val user = task.result
// First login creates the user; later logins match — session token issued
// Account linking: attach a second provider to the same user
user.linkWithInBackground("facebook", fbAuthData)
} I quattro ruoli
| Ruolo | Chi è | In termini di “Accedi con…” |
|---|---|---|
| Resource owner | L’utente | Chi usa l’app |
| Client | L’app che chiede l’accesso | L’app che mostra il pulsante |
| Authorization server | Emette codici e token | Le pagine di accesso dell’identity provider |
| Resource server | L’API che custodisce i dati | L’API di profilo/utente del provider |
Grant type: quale flusso, e che cosa ha cambiato OAuth 2.1
| Grant | Per | Utente presente? | Stato in OAuth 2.1 |
|---|---|---|---|
| Authorization code + PKCE | Web, mobile, SPA – tutto ciò che coinvolge un utente | Sì | La scelta predefinita – PKCE richiesto a quasi tutti i client |
| Client credentials | Machine-to-machine, account di servizio | No | Mantenuto |
| Device authorization | Televisori, console, CLI | Sì, su un secondo dispositivo | Mantenuto |
| Refresh token | Rinnovare l’accesso in silenzio | No | Mantenuto – rotazione o sender-constraining richiesti ai client pubblici |
| Implicit | SPA legacy (token nei frammenti di URL) | Sì | Rimosso |
| Password (ROPC) | L’app raccoglie da sé la password | Sì | Rimosso – vanifica l’intero senso dell’operazione |
OAuth 2.1 è consolidamento, non rivoluzione: le rimozioni qui sopra, più i redirect URI a corrispondenza esatta e il divieto di bearer token nelle query string – le lezioni di sicurezza accumulate in un decennio, ripiegate in un unico documento. Le spiegazioni definitorie per la maggior parte non hanno recuperato il ritardo; diverse insegnano ancora il flusso implicit senza alcun avvertimento.
OAuth vs. OpenID Connect: autorizzazione vs. autenticazione
La frase che tutti ripetono – “OAuth non è autenticazione” – merita il suo meccanismo, perché è il meccanismo a rendere sfruttabile un accesso ingenuo:
| Access token (OAuth) | ID token (OIDC) | |
|---|---|---|
| Indirizzato a | Il resource server (API) | L’app (aud = il suo client ID) |
| Prova | Questo portatore può accedere a questi scope | Questo utente (sub) si è autenticato presso questo emittente (iss), adesso (iat/exp), per questo accesso (nonce) |
| Formato | Spesso opaco per il client | JWT firmato che l’app deve validare |
| Si può usare per l’accesso? | No – qualunque app autorizzata dall’utente ne possiede uno; non dice nulla su chi è presente | Sì – è esattamente il suo mestiere |
“Accedere con un semplice access token” fallisce perché gli access token sono prova trasferibile di permesso, non di presenza: un’app malevola che abbia ottenuto un token per i propri scopi potrebbe riutilizzarlo altrove per impersonare l’utente. OpenID Connect esiste proprio per chiudere quella falla – gli stessi flussi, più un’attestazione di identità legata crittograficamente all’app.
Login social: il pulsante sopra l’impianto
Il login social è OIDC confezionato come UX: il provider autentica, l’app riceve claim verificati e crea o ritrova un account – nessuna password archiviata, nessun flusso di reimpostazione da mantenere, la MFA del provider ereditata gratis. I trade-off di prodotto meritano numeri onesti. Le promesse di un 20–50 % di registrazioni in più sono folklore dei fornitori; i test controllati hanno misurato piuttosto un 3 %, anche se oggi circa un terzo degli accessi consumer arriva per via social – gli utenti vogliono chiaramente l’opzione. Le pratiche che spostano davvero la conversione: offrire due o tre provider che il pubblico usa per davvero (la griglia di partenza di pulsanti danneggia in modo misurabile), tenere sempre un’alternativa via e-mail, e sapere che i redirect OAuth si rompono dentro le WebView incorporate – una causa reale di iscrizioni mobili fallite. Due fatti specifici di un provider pesano abbastanza da essere nominati: Sign in with Apple emette indirizzi di relay privato (…@privaterelay.appleid.com), quindi il collegamento basato su e-mail e le liste di distribuzione devono aspettarsi alias opachi – e le regole dell’App Store impongono alle app che offrono un accesso di terze parti di offrire anche un’opzione di accesso rispettosa della privacy.
Collegamento degli account e la trappola dell’e-mail
La stessa persona arriverà da due provider, e entrambi dichiareranno [email protected]. La regola che evita la vulnerabilità classica: l’identità si ancora all’identificatore sub stabile del provider, mai alla sola e-mail. Le e-mail cambiano, vengono riciclate e – ecco il bordo tagliente – non sono sempre verificate: una classe di vulnerabilità emersa nel 2023 ha mostrato che le app che si fidavano di un claim e-mail non verificato nei token di un grande provider erano esposte al furto dell’account da parte di chiunque potesse impostare quella e-mail sul proprio account provider. Conviene collegare automaticamente solo su e-mail che il provider attesta come verificate; altrimenti si chiede all’utente di collegare in modo esplicito. E va previsto anche l’uscita: chi resta bloccato fuori da un provider (succede senza preavviso) perde ogni app a valle, a meno che non gli sia stato offerto un secondo metodo collegato – ed è per questo che “un solo metodo di accesso per utente” è una fabbrica di ticket di supporto travestita da semplicità.
Casi d’uso tipici
- Accesso alle app consumer – il login social canonico: meno attrito, MFA ereditata, nessun archivio di password da far violare.
- Accesso ad API di terze parti – il caso OAuth originale: un’app di agenda che legge il calendario senza la password.
- Autenticazione machine-to-machine – client credentials fra servizi, senza alcun utente in vista.
- Identità multi-provider – un account, diversi metodi di accesso collegati, scollegamento e recupero per singolo utente.
- Ponte verso l’SSO aziendale – lo stesso pattern OIDC puntato su un identity provider del personale invece che su uno social.
Conviene offrire il login social? Matrice decisionale
| Situazione | Orientamento |
|---|---|
| App consumer, pubblico fortemente mobile | Sì – 2 o 3 provider + alternativa via e-mail |
| App iOS che offre un accesso di terze parti | Un’opzione di accesso rispettosa della privacy è obbligatoria – prevedere le e-mail di relay |
| Prodotto B2B o aziendale | OIDC sì, ma verso l’SSO del personale, non verso il social |
| Dati regolamentati, ciclo di vita degli account rigido | Prudenza – il blocco presso il provider e la verifica d’identità chiedono risposte |
| MVP che ha bisogno di autenticazione questa settimana | Sì, tramite un backend che avvolge i flussi |
| Utenti senza account presso i grandi provider | Prima e-mail o passwordless; il social come opzione |
Limiti e trade-off
- Si ereditano le decisioni del provider. Schermate di consenso, durata delle sessioni, recupero degli account e deprecazioni arrivano secondo il suo calendario, non secondo il proprio.
- Il rischio di concentrazione è reale. Un disservizio del provider o un account bloccato è un’interruzione dell’accesso; i metodi di riserva collegati sono la mitigazione, non un extra facoltativo.
- La flessibilità di OAuth è la sua debolezza storica. Un framework con opzioni invita combinazioni insicure – 2.1 esiste perché flussi implicit, redirect con jolly e refresh token senza rotazione continuavano ad andare in produzione.
- I flussi di redirect hanno bordi taglienti.
state(CSRF), i redirect URI esatti (open redirect e furto del codice) e PKCE (intercettazione) sono ciascuno a un parametro dimenticato di distanza da un incidente. - I claim social sono un pavimento, non un profilo. Arrivano subject, e-mail, nome – gli attributi oltre quelli richiedono comunque un onboarding proprio, e i relay per la privacy fanno sì che anche l’e-mail possa essere un alias.
OAuth e login social su Back4app
Back4app è una piattaforma open-source di Backend as a Service (BaaS) che combina database gestito, API REST e GraphQL generate automaticamente, autenticazione, archiviazione di file e funzioni serverless con Cloud Code. I flussi qui sopra si ripiegano nelle schede di codice: il client ottiene nativamente i token del provider, li passa a logInWith, e gli adattatori di autenticazione di Back4app li verificano lato server presso il provider prima di creare o ritrovare lo User – le identità dei provider vivono in blocchi authData per singolo provider, indicizzati sul subject stabile, che è la regola di collegamento degli account imposta per costruzione. linkWith aggancia provider aggiuntivi (o una credenziale e-mail) allo stesso utente, rispondendo al problema del blocco in una sola chiamata, e il token di sessione che l’app riceve funziona poi su tutte le API REST, GraphQL e Live Query, con le ACL e i permessi a livello di classe a decidere che cosa possa toccare. La danza dei redirect, la verifica dei token e i casi limite del collegamento arrivano come comportamento di piattaforma – i provider si configurano nella dashboard e resta da spedire il pulsante.
Domande frequenti
Che cos'è OAuth 2.0, in parole semplici?
Uno standard che permette a un'app di ottenere un accesso limitato a un account su un altro servizio senza che la password le venga consegnata. Al posto delle credenziali, il servizio emette per l'app un token temporaneo e delimitato da scope – come la tessera di un albergo che apre la camera e la palestra ma non l'ufficio del direttore, e scade al check-out.
OAuth è autorizzazione o autenticazione?
Autorizzazione – lo dice il titolo stesso della specifica: la RFC 6749 si chiama "The OAuth 2.0 Authorization Framework". Risponde a "a che cosa può accedere questa app?", non a "chi è questo utente?". L'accesso costruito sopra OAuth è standardizzato da OpenID Connect, che aggiunge un ID token firmato con cui l'identità viene attestata all'app.
Qual è la differenza tra OAuth 2.0 e OpenID Connect?
OpenID Connect è un sottile strato di identità posato su OAuth 2.0: gli stessi flussi, più un ID token firmato (un JWT indirizzato all'app, con i claim issuer, subject, audience e nonce) e un endpoint userinfo. Ogni vero pulsante "Accedi con…" è OIDC o un equivalente proprietario del provider – OAuth da solo non definisce alcun modo di provare chi si è autenticato.
Quali sono i grant type di OAuth?
Authorization code con PKCE ogni volta che c'è di mezzo un utente; client credentials per il machine-to-machine; device authorization per televisori e CLI; refresh token per rinnovare l'accesso. I grant implicit e password sono legacy – entrambi rimossi in OAuth 2.1, e nessun progetto nuovo dovrebbe usarli.
Che cosa sono gli access token e i refresh token?
L'access token è la credenziale di breve durata che l'app presenta all'API: delimitata da scope, con scadenza, spesso un JWT. Il refresh token vive più a lungo e si scambia con nuovi access token senza chiedere di nuovo nulla all'utente; la pratica moderna lo ruota a ogni uso, così un token rubato muore al primo riutilizzo.
Che cos'è PKCE e perché è obbligatorio?
Proof Key for Code Exchange (si pronuncia "pixie"): l'app avvia il flusso con l'hash di un segreto e deve presentare l'originale quando riscatta l'authorization code, provando che chi riscatta è chi ha iniziato. Nato per le app mobili, incapaci di custodire un client secret, difende dall'intercettazione del codice – e la bozza di OAuth 2.1 lo richiede a quasi tutti i client.
Che cos'è il login social e come funziona?
È OIDC confezionato in un pulsante: l'app reindirizza all'endpoint di autorizzazione del provider; l'utente si autentica là – la password non tocca mai l'app – e acconsente; il provider reindirizza indietro con un codice monouso; l'app lo scambia con i token e legge il subject stabile dell'ID token per creare o ritrovare l'account locale.
Il login social è sicuro?
In generale sì: l'utente eredita l'autenticazione indurita e la MFA del provider invece di un'ennesima password riciclata. In cambio arrivano il rischio di concentrazione – un account provider bloccato o compromesso colpisce ogni app a valle – e la cura nell'implementazione: l'identità va ancorata al subject stabile del provider e a claim verificati, mai a un campo e-mail grezzo.