Cosa devi sapere su OAuth2 e sull'accesso con Facebook

Pubblicato: 2022-03-10
Riepilogo rapido ↬ OAuth2 consente agli utenti di accedere facilmente alla tua app, di non dover ricordare una password per ogni sito Web e di fidarsi della tua sicurezza. OAuth2 domina il settore in quanto non esiste un altro protocollo di sicurezza che si avvicini all'adozione di OAuth2.

Nel caso ti stia chiedendo cosa sia OAuth2, è il protocollo che consente a chiunque di accedere con il proprio account Facebook. Alimenta il pulsante "Accedi con Facebook" nelle app e sui siti Web ovunque.

Questo articolo mostra come funziona "Accedi con Facebook" e spiega il protocollo alla base di tutto. Imparerai perché vorresti accedere con Facebook, Google, Microsoft o una delle tante altre aziende che supportano OAuth2.

Questo articolo mostra come funziona "Accedi con Facebook" e spiega il protocollo alla base di tutto. Imparerai perché vorresti accedere con Facebook, Google, Microsoft o una delle tante altre aziende che supportano OAuth2.

Vedremo due esempi: perché Spotify utilizza Facebook per consentirti di accedere all'app mobile Spotify e perché Quora utilizza Google e Facebook per consentirti di accedere al suo sito Web.

Ulteriori letture su SmashingMag:

  • Quattro modi per creare un'applicazione mobile
  • Come creare interfacce utente oneste e aiutare gli utenti a prendere decisioni migliori
  • Mantenere la tua app Android popolare dopo il lancio
  • Playlist di Spotify per alimentare le sessioni di programmazione e progettazione
Altro dopo il salto! Continua a leggere sotto ↓

Prima di OAuth2

OAuth2 ha vinto una battaglia sugli standard alcuni anni fa. È l'unico protocollo di autenticazione supportato dai principali fornitori. Google consiglia OAuth2 per tutte le sue API e l'API Graph di Facebook supporta solo OAuth2.

Il modo migliore per capire OAuth2 è guardare cosa è successo prima e perché avevamo bisogno di qualcosa di diverso. Tutto è iniziato con l'autenticazione di base.

Aut. di base

Gli schemi di autenticazione si concentrano su due domande chiave: chi sei? E puoi dimostrarlo?

Il modo più comune per porre queste due domande è con un nome utente e una password. Il nome utente dice chi sei e la password lo dimostra.

Basic Auth è stato il primo schema di autenticazione web. Sembra divertente, ma "Autenticazione di base" era il suo vero nome nelle specifiche pubblicate per la prima volta nel 1999.

Basic Auth consente ai server Web di richiedere queste credenziali in un modo comprensibile ai browser. Il server restituisce un codice di risposta HTTP di 401 (che significa che è richiesta l'autenticazione) e aggiunge un'intestazione speciale alla risposta, denominata WWW-Authenticate , con un valore speciale di Basic .

Quando il browser vede questo codice di risposta e questa intestazione, mostra una finestra di dialogo di accesso popup:

La finestra di dialogo di accesso dell'autenticazione di base
La finestra di dialogo di accesso dell'autenticazione di base

La parte migliore di Basic Auth è la sua semplicità. Non è necessario scrivere una schermata di accesso. Il browser gestisce tutto ciò e invia semplicemente il nome utente e la password al server. Dà inoltre al browser la possibilità di gestire in modo speciale la password, sia ricordandola per l'utente, recuperandola da un plug-in di terze parti o prelevando le credenziali dell'utente dal proprio sistema operativo.

Lo svantaggio è che non hai alcun controllo sull'aspetto della schermata di accesso. Ciò significa che non puoi modellarlo o aggiungere nuove funzionalità, come "Password dimenticata?" collegamento o un'opzione per creare un nuovo account. Se desideri una maggiore personalizzazione, dovresti scrivere un modulo di accesso personalizzato.

Moduli di accesso personalizzati

I moduli di accesso personalizzati ti danno tutto il controllo che desideri. Scrivi un modulo HTML e richiedi le credenziali. Quindi invii il modulo e gestisci l'accesso come preferisci. Hai il controllo totale: puoi modellarlo, chiedere maggiori dettagli o aggiungere più collegamenti.

Alcuni siti Web, come WordPress, utilizzano un semplice modulo per la schermata di accesso:

Schermata di accesso a WordPress
Schermata di accesso a WordPress

LinkedIn consente agli utenti di accedere o creare un account sulla stessa pagina, senza dover andare in un'altra parte del sito Web:

Schermata di accesso a LinkedIn
Schermata di accesso a LinkedIn (Visualizza versione grande)

L'accesso basato su moduli è molto popolare, ma presenta un grosso problema fondamentale: gli utenti devono comunicare al sito Web la propria password.

Mantenere segreti i segreti

Negli ambienti di sicurezza, chiamiamo segreta una password. È un'informazione che solo tu hai e dimostra che sei te stesso. Il segreto può anche essere qualcosa di più di una semplice password; ne parleremo di più un po 'più tardi.

Un sito Web può adottare tutte le misure di sicurezza del mondo, ma se l'utente condivide la propria password, la sicurezza è svanita. Gli hacker hanno violato il sito web di Gawker nel 2010, esponendo le password di molti utenti. Sebbene questo fosse un problema per Gawker, il problema non si è fermato qui. La maggior parte delle persone riutilizza le password, quindi gli hacker hanno preso i dati trapelati da Gawker e hanno cercato di accedere a siti Web più critici, come Gmail, Facebook ed eBay. Chiunque abbia usato una password Gawker per cose più importanti ha perso molto di più degli ultimi pettegolezzi sul sex tape di Hulk Hogan.

Assicurarsi che gli utenti non riutilizzino una password per più account è la prima metà del problema, ed è impossibile. Finché le persone devono creare account diversi su Internet, riutilizzeranno le loro password.

La seconda metà del problema è l'archiviazione sicura delle password.

Quando qualcuno accede alla tua app, devi verificare la sua password e ciò significa che hai bisogno di una copia per verificarla. Potresti archiviare tutti i nomi utente e le password in un database da qualche parte, ma ora rischi di perdere quelle password o di essere violato. La procedura consigliata consiste nell'utilizzare una funzione hash, ad esempio una delle funzioni SHA-2. Questa funzione crittografa i dati in un modo che non potrai mai più recuperarli, ma puoi replicare la crittografia: "la mia password" eseguirà l'hash su qualcosa come bb14292d91c6d0920a5536bb41f3a50f66351b7b9d94c804dfce8a96ca1051f2 ogni volta.

E ora siamo fuori nell'erba alta: ti sto dicendo come implementare i protocolli crittografici. Successivamente, dovrò spiegare come aggiungere un sale ai tuoi dati e quali libri di testo leggere sugli attacchi man-in-the-middle. Tutto quello che volevi fare era scrivere un'app e ora devi diventare un esperto di sicurezza. Dobbiamo fare un passo indietro.

OAuth2

Probabilmente non sei un esperto di sicurezza. Anche se lo fossi, non ti fiderei comunque della mia password. OAuth2 ti offre un modo migliore.

Ad esempio, utilizzo Spotify sul mio iPad. Pago l'azienda $ 10 al mese per ascoltare musica. Spotify mi dà accesso solo su tre dispositivi, quindi ho bisogno di una password per assicurarmi che nessun altro utilizzi il mio account. Il mio account Spotify non è un grosso problema di sicurezza. Essere hackerato non sarebbe la fine del mondo, ma l'azienda ha la mia carta di credito, quindi voglio essere sicuro di essere al sicuro.

Non accedo quasi mai a Spotify, quindi non voglio creare un altro account e devo ricordare un'altra password. Spotify mi offre un'opzione migliore:

Schermata di accesso a Spotify con l'opzione _Accedi con Facebook_
Schermata di accesso di Spotify con l'opzione "Accedi con Facebook" (Visualizza versione grande)

Posso usare il mio account Facebook per accedere. Quando tocco quel pulsante, Spotify mi invia a facebook.com e accedo lì. Potrebbe sembrare un piccolo dettaglio, ma è il passaggio più importante dell'intero processo.

Schermata di accesso a Facebook per Spotify
Schermata di accesso a Facebook per Spotify (Visualizza versione grande)

I programmatori di Spotify avrebbero potuto scrivere da soli un modulo di accesso e quindi inviare il mio nome utente e password a Facebook con un'API back-end, ma ci sono due grandi motivi per cui non voglio che lo facciano:

  • Non mi fido di Spotify con la mia password di Facebook. Uso Facebook per connettermi con gli amici e non voglio essere hackerato. Non mi fido che Spotify gestirà correttamente la password. Inoltre, non credo che eviterà la tentazione di farci qualcosa di divertente. Forse proverebbe a memorizzarlo in modo da poterlo utilizzare in seguito. Forse ha un bug che lo scrive in un file da qualche parte prima di inviarlo a Facebook, quindi un hacker potrebbe prenderlo. Mi dispiace, Spotify; Solo che non sono il tipo che si fida.
  • Non voglio lasciare che Spotify faccia tutto. Voglio che Spotify riproduca musica. Non voglio che venga pubblicato sui muri dei miei amici quando ascolto le Spice Girls. Inoltre, non voglio lasciare che scarichi il mio elenco di amici e li bugichi per unirsi a Spotify. Se fornissi a Spotify la mia password di Facebook, potrebbe accedere come me su Facebook; potrebbe fare qualsiasi cosa io possa fare.

Ci sono anche due grandi ragioni per cui Spotify non vuole farlo:

  • Facebook ha più opzioni per farmi accedere. . Posso accedere con il mio nome utente e password o posso accedere con l'app di Facebook. Posso anche recuperare la mia password da Facebook o ricevere aiuto che Spotify non può darmi. Se avessi dato a Spotify la mia password, non avrei ricevuto nessuna di queste opzioni.
  • Il mio segreto potrebbe non essere una password. . Una password è una sicurezza sufficiente per il mio account Spotify da $ 10 al mese, ma potrebbe non essere sufficiente per la mia banca o qualcosa di ancora più importante. Ci sono molti altri segreti che potrei fornire: potrei avere una smart card, o potrei vivere in un film di Mission Impossible e usare uno scanner retinico.

Non sono in un film di Mission Impossible, ma nel mondo reale molte aziende usano l'autenticazione a due fattori, come una password e qualcos'altro. Il metodo più comune è utilizzare il telefono. Quando vuoi effettuare il login, l'azienda ti invia un sms con un codice speciale che dura qualche minuto; quindi digita il codice o utilizza un'app per inserirlo.

Ora l'azienda è sicura che nessuno può accedere al tuo account senza il tuo telefono. Se qualcuno ruba la tua password, non può ancora accedere. Finché non perdi il telefono, tutto è al sicuro.

Facebook non è l'unico provider OAuth2. Quando accedo a Quora con il mio account Google, Google mi dice cosa vorrebbe fare Quora e mi chiede se va bene:

La finestra di dialogo del passaggio 2 per il processo OAuth2 di Google Quora
La finestra di dialogo del passaggio 2 per il processo OAuth2 di Google e Quora

Potrebbe andar bene consentire a Quora di visualizzare il mio indirizzo e-mail e i dati di base del mio profilo, ma non voglio che gestisca i miei contatti. OAuth2 mi mostra tutti gli accessi desiderati da Quora, consentendomi di scegliere a cosa concedere l'accesso.

Quindi, questi sono i vantaggi di OAuth2. Vediamo come funziona.

Come funziona OAuth2

Facebook, Google e la maggior parte degli altri provider OAuth2 trattano i client nativi in ​​modo diverso dai client web. I client nativi sono considerati più sicuri e ottengono token e aggiornano i token che possono durare per mesi. I client Web ottengono token molto più brevi, che in genere scadono quando l'utente chiude il browser o non fa clic sul sito Web per un po' di tempo.

In entrambi i casi, la procedura di accesso è la stessa. La differenza sta nella frequenza con cui l'utente deve attraversarlo.

L'accesso a OAuth2 segue questi passaggi generali:

  1. L'utente tenta di eseguire qualcosa che richiede l'autenticazione. Questo potrebbe essere semplice come aprire un'app o fare clic su un pulsante "Accedi".
  2. L'app o il sito Web determina che l'utente non ha ancora effettuato l'accesso e avvia il processo di accesso. Lo fa aprendo una pagina Web e inviandola a un URL speciale su Facebook, Google o qualsiasi altro sito Web fornisce il tuo OAuth2.

L'apertura di una nuova finestra del browser per il provider OAuth2 è un passaggio cruciale. Questo è ciò che consente ai provider di mostrare i propri moduli di accesso e di chiedere a ciascun utente le informazioni di accesso di cui hanno bisogno. La maggior parte delle app lo fa con una visualizzazione Web incorporata.

Insieme all'URL di accesso del provider, devi inviare alcuni parametri URL che indichino al provider chi sei e cosa vuoi fare:

  • client_id Indica al provider OAuth2 qual è la tua app. Dovrai registrare la tua app in anticipo per ottenere un ID cliente.
  • redirect_uri Questo dice al provider dove vuoi andare quando hai finito. Per un sito Web, questo potrebbe tornare alla pagina principale; un'app nativa potrebbe andare a una pagina che chiude la visualizzazione Web.
  • response_type Questo dice al provider cosa vuoi indietro. Normalmente, questo valore è token , per indicare che si desidera un token di accesso, o code , per indicare che si desidera un codice di accesso. I provider possono anche estendere questo valore per fornire altri tipi di dati.
  • scope Indica al provider a cosa desidera accedere la tua app. È così che Google sa che Quora sta chiedendo l'accesso per gestire i tuoi contatti. Ogni provider ha un diverso insieme di ambiti.

Ci sono campi aggiuntivi che possono aggiungere più sicurezza o aiutare con la memorizzazione nella cache. Alcuni provider possono anche aggiungere più campi, ma questi quattro sono quelli importanti.

Una volta che l'app apre la visualizzazione Web, il provider prende il sopravvento. Potrebbero semplicemente chiedere un nome utente e una password semplici, oppure potrebbero presentare più schermate che richiedono qualsiasi cosa, dal nome del tuo insegnante preferito al nome da nubile di tua madre. Dipende tutto da loro. La parte importante è che, quando il provider ha finito, ti reindirizzerà a te e ti darà un token.

È tutta una questione di gettoni

Al termine del processo, il provider ti fornirà un token e un tipo di token. Esistono due tipi di token: token di accesso e token di aggiornamento. Il tipo di cliente che hai determinerà quali tipi di token puoi richiedere.

Quando accedo alla mia app Spotify, posso rimanere connesso per mesi, perché il presupposto è che il mio telefono sia utilizzato solo da me. Facebook si fida dell'app Spotify per gestire i token e mi fido dell'app Spotify per non perdere i token.

Quando il token di accesso scade (in genere, in una o due ore), Spotify può utilizzare il token di aggiornamento per ottenerne uno nuovo.

Il token di aggiornamento dura mesi. In questo modo, devo accedere al mio telefono solo poche volte all'anno. Lo svantaggio è che se perdo quel token di aggiornamento, qualcun altro potrebbe usare il mio account per mesi. Il token di aggiornamento è così importante che iOS fornisce un portachiavi per i token, dove si assicura di crittografarli e archiviarli in modo sicuro.

L'utilizzo di OAuth2 in un'applicazione Web funziona allo stesso modo. Invece di utilizzare una visualizzazione Web, puoi aprire la richiesta di accesso OAuth2 in un frame, un iframe o una finestra separata. Puoi anche aprirlo nella pagina corrente, ma ciò causerebbe la perdita di tutto lo stato dell'applicazione JavaScript ogni volta che qualcuno ha bisogno di accedere.

Quando accedo a Quora con il mio browser web, non ricevo un token di aggiornamento. Vogliono che il token scada e mi richieda di accedere di nuovo quando esco dal browser o addirittura vado via per pranzo. I client non attendibili non possono aggiornare il token perché non possono essere considerati attendibili per mantenere l'importante token di aggiornamento. È più sicuro ma meno conveniente, perché ti chiederanno di accedere di nuovo molto più frequentemente.

Utilizzo di OAuth2 nella tua app

Ora sai come funziona OAuth2, ma probabilmente non vuoi implementare il tuo client OAuth2. Potresti andare a leggere l'intera specifica OAuth 2.0 di 75 pagine se hai problemi a dormire, ma non è necessario. Alcune fantastiche librerie sono disponibili per l'uso.

iOS ha il supporto integrato per OAuth2. Corrina Krych ha un tutorial molto utile sull'uso di OAuth 2.0 con Swift. Ti guida attraverso come ottenere un token, come integrare le visualizzazioni nella tua app e dove archiviare i tuoi token.

Android ha anche il supporto integrato per OAuth2. Devo ammettere che non ne ho molta familiarità perché mi concentro su iOS, ma ci sono alcune buone sezioni nella documentazione per mostrarti esempi e alcune librerie open source per renderlo ancora più semplice.

JavaScript non ha il supporto integrato per OAuth2, ma ci sono client per tutte le principali librerie JavaScript. React supporta completamente OAuth2. AngularJS ha il supporto di terze parti per OAuth2.0 per molti progetti. Ne ho anche scritto uno.

Una volta che hai un client OAuth2, dovrai scegliere un provider.

Di chi ti fidi?

Il grande presupposto qui è che mi fido di Facebook più di Spotify. Non ho una buona ragione per questo. Facebook non rende pubblica la sua sicurezza interna e non c'è un buon modo per controllarla. Nemmeno Spotify. Non ci sono rapporti sui consumatori per la sicurezza OAuth2. Fondamentalmente mi fido di Facebook perché è più grande. Mi fido di Facebook perché altre persone lo fanno.

Mi fido anche di più di Facebook ogni volta che faccio clic sul pulsante "Accedi con Facebook". Se Facebook perde la mia password, gli hacker avranno accesso non solo al mio account Facebook, ma anche al mio account Spotify e a qualsiasi altro servizio a cui ho effettuato l'accesso con il mio account Facebook. Il vantaggio è che c'è solo un posto in cui devo reimpostare la mia password per risolvere il problema.

Non devo fidarmi di Facebook, ma devo fidarmi di qualcuno. Qualcuno deve autenticarmi. Devo scegliere il fornitore di cui mi fido.

Scelta di un provider OAuth2

Wikipedia mantiene un elenco di provider OAuth, ma non ti importerebbe della maggior parte di essi. I grandi sono Facebook e Google. Potresti anche voler guardare Amazon o Microsoft.

Tutti e quattro sono grandi e facili da integrare. Facebook fornisce istruzioni per la registrazione di un'app. Google ha passaggi simili. L'idea di base è creare un account sviluppatore e quindi creare un ID app. Il provider ti fornisce quindi un ID cliente che puoi utilizzare per effettuare richieste.

Puoi anche scegliere più fornitori. Quora ti consente di accedere con Facebook o Google; poiché entrambi utilizzano OAuth2, è possibile utilizzare lo stesso codice per entrambi.

Cosa manca da OAuth2

OAuth2 fa un ottimo lavoro nel risolvere un problema complesso, ma manca un paio di cose:

  • Lo standard non è completamente standard. Non sono mai stato in grado di scrivere un singolo client OAuth2 in grado di accedere sia a Facebook che a Google senza alcune affermazioni if . Ciascuno interpreta le specifiche in modo diverso e ci sono piccoli dettagli dissimili per ciascuno. Inoltre hanno sempre idee diverse su quali ambiti fornire. L'uso di una libreria per l'integrazione con OAuth2 aiuta molto con questo problema, ma non sarà mai trasparente al 100% nel codice della tua app.
  • Disconnettersi è complicato. . Ogni app o sito Web che utilizza OAuth2 ha un pulsante di disconnessione, ma la maggior parte dimenticherà semplicemente i token senza invalidarli. L'app dimenticherà tutti i tuoi token attuali e consentirà a qualcun altro di accedere, ma i tuoi token sono ancora validi. Se un hacker ha rubato il tuo token, potrebbe comunque usarlo e accedere come te.

Esiste una specifica separata per invalidare i token OAuth2, ma non è stata rilevata da molti dei principali provider. OAuth2 non fornisce un modo per recuperare se un hacker ottiene il tuo token di aggiornamento; anche se puoi eliminare la tua copia locale del token, l'hacker lo avrà comunque. Molti provider ti offrono un modo per sospendere il tuo account, ma non esiste un modo standard per farlo.

A difesa di OAuth2, questo è un problema difficile, perché molti provider utilizzano la crittografia a chiave pubblica per creare token senza stato. Ciò significa che il server non ricorda i token che ha creato, quindi non può dimenticarli in seguito.

L'altro grosso problema con OAuth2 è che dipendi dal tuo provider. Quando Facebook non funziona, anche il pulsante "Accedi con Facebook" nella tua app. Se Google decide di iniziare a farti pagare per supportare OAuth2 o ti chiede di condividere i tuoi profitti con esso, non puoi fare nulla. Questa è l'arma a doppio taglio di fidarsi di un provider: stanno facendo molto per te, ma hanno il controllo sui tuoi utenti.

OAuth2 gestisce il mondo

Anche con un paio di funzionalità mancanti e una grande dipendenza, OAuth2 è ancora una scelta eccellente. Consente agli utenti di accedere facilmente alla tua app, di non dover ricordare una password per ogni sito Web e di fidarsi della tua sicurezza. OAuth2 è una scelta molto popolare. Domina il settore. Nessun altro protocollo di sicurezza si avvicina all'adozione di OAuth2.

Ora sai da dove viene OAuth2 e come funziona. Fai scelte intelligenti su chi fidarti, smetti di leggere articoli sulla memorizzazione sicura delle password crittografate e trascorri più tempo a scrivere la tua fantastica app.