Runscope Blog

Gestione dei claim

In seguito, dobbiamo pensare attentamente ai claim. Un claim è semplicemente la coppia nome/valore incorporata nei nostri Token di accesso e ID. Per esempio, si potrebbe avere un claim user_id o email in modo che le applicazioni a valle possano usarli per creare profili o prendere decisioni. La parte confusa è che la specifica OAuth Core non introduce il concetto di claim o addirittura include la parola claim. Questo è utile perché possiamo definire qualsiasi cosa di cui abbiamo bisogno. Sfortunatamente, la sfida è che le persone le definiranno in qualsiasi modo abbiano bisogno. La specifica JWT (RFC 7519) introduce il concetto e definisce una struttura di base, ma ancora non stabilisce alcuna convenzione per i nomi, le strutture, ecc.

Usare OpenID Connect ci protegge abbastanza. Definisce un semplice insieme di richieste per i dettagli dell’utente come nome, indirizzo e simili. Se usiamo solo quelle e limitiamo l’accesso secondo gli scopi appropriati, l’utente sa quali informazioni sta condividendo e le applicazioni sanno come usarle.

In alternativa, quando aggiungiamo ulteriori rivendicazioni, il desiderio naturale è quello di avere un identificatore unico per l’utente. Se siamo attenti, usiamo una chiave primaria offuscata che non ha alcun significato al di fuori del nostro sistema. Se non stiamo attenti, potrebbe essere un identificatore di cliente, un numero di dipendente o anche un numero di previdenza sociale. Questa è la stessa situazione in cui Facebook sta lottando con le implicazioni della condivisione di troppe informazioni sulla rete di un utente attraverso le sue API.

Dobbiamo essere riflessivi e considerare le conseguenze delle informazioni che mettiamo nei nostri token. Non dovremmo mai includere dati “solo nel caso in cui” e invece aspettare casi d’uso specifici che scegliamo di supportare. Qualsiasi altra cosa è rischiosa nel migliore dei casi e irresponsabile nel peggiore.

Tipi di concessione – Quando e perché

Mentre sono saltato direttamente agli ambiti e alle richieste, l’altro errore più comune è legato ai tipi di concessione OAuth specifici o ai flussi. I quattro tipi di concessione – Authorization Code, Implicit, Resource Owner Password e Client Credential – definiscono come un’applicazione può recuperare i token dal server OAuth e sono utilizzati in diversi casi d’uso.

Authorization Code

Il flusso Authorization Code è il più potente e il più sicuro per default. Quando l’applicazione reindirizza l’utente all’Identity Provider per autenticarsi, l’IdP passa indietro un codice di autorizzazione di breve durata e monouso. L’applicazione usa il codice di autorizzazione per recuperare il token di accesso.

La parte importante è duplice: Primo, quando l’utente vede il codice di autorizzazione, è già stato consumato e quindi non può essere usato di nuovo. Secondo, il token di accesso è conservato dall’applicazione nel backend. Supponendo che l’applicazione sia costruita in modo sicuro, un utente malintenzionato deve trovare un altro modo per attaccarla.

Purtroppo, questo non funziona per le applicazioni lato client, come molte applicazioni Javascript o la maggior parte delle applicazioni mobili, poiché l’applicazione stessa può essere attaccata o decompilata per ottenere informazioni sensibili. Pertanto, abbiamo bisogno di un approccio diverso.

Implicito

Il flusso implicito è progettato specificamente per le applicazioni mobili o le applicazioni Javascript lato client dove le credenziali incorporate potrebbero essere compromesse. La meccanica è semplice in quanto l’applicazione reindirizza l’utente all’Identity Provider per l’autenticazione, l’IdP passa indietro il token (o i token) e l’applicazione lo usa secondo gli scopi che ha.

Siccome è molto probabile che l’utente possa interagire con il token (o i token), è importante che i nostri casi d’uso riflettano questo. Se abbiamo un’applicazione bancaria, permettere l’ambito send_wire_transfers_to_russia potrebbe essere una cattiva idea a meno che non abbiamo fattori aggiuntivi integrati nel nostro processo di autenticazione per convalidare che l’utente giusto lo stia usando. La prossima volta che perderete il vostro telefono, lo apprezzerete.

Come risultato, questo è spesso usato per scenari OpenID Connect in cui un utente vuole fornire informazioni fidate sul profilo a una terza parte ma non necessariamente l’accesso o i permessi ad altri sistemi. Poiché i concetti sottostanti sono gli stessi e l’implementazione sembra molto simile, è la maggior parte del beneficio per lo stesso sforzo.

Password del proprietario della risorsa

Paragonato ai precedenti tipi di concessione, Resource Owner Password mi rende nervoso. Con entrambi i flussi Authorization Code e Implicit, l’applicazione reindirizza l’utente all’Identity Provider per inviare il proprio nome utente e password. Di conseguenza, l’applicazione non vede mai le loro credenziali. Con il flusso Resource Owner Password, l’applicazione stessa accetta le credenziali e le invia per conto dell’utente.

Se l’applicazione è malevola o anche solo poco sviluppata, potrebbe memorizzare quelle credenziali e compromettere le informazioni dell’utente. Pertanto, dovreste usarlo solo se state costruendo applicazioni per i vostri utenti per interagire con i vostri sistemi legacy. Per esempio, una banca potrebbe implementarlo per un portale interno per i dipendenti.

Ma ricordate: Fondamentalmente, stai addestrando gli utenti a mettere le loro credenziali in applicazioni di cui potrebbero non fidarsi, il che è una cattiva abitudine nel migliore dei casi e un rischio per la sicurezza in ogni momento.

Client Credential

Il tipo di concessione Client Credential è progettato esclusivamente per operazioni backend da server a server. Pensatelo come il nome utente e la password di un server. Concettualmente, non è lontano da come la vostra applicazione si connette ad altri sistemi backend come il vostro database o Twilio. Il vantaggio è che il tuo provider OAuth può restituire informazioni di configurazione o altri dettagli all’interno del token stesso.

Infine, dato che non c’è un utente coinvolto, non supporta OpenID Connect.

In chiusura

Mentre questo intero post ha riguardato OAuth, probabilmente hai notato che non ho incluso alcun codice. La ragione è semplice: Le decisioni di design sono ancora più importanti.

Se i vostri scopi sono troppo ampi o le vostre richieste includono informazioni sensibili o implementate il flusso sbagliato per l’ambiente, le migliori librerie del mondo non vi proteggeranno. Le informazioni dei vostri utenti saranno compromesse, le vostre applicazioni saranno vulnerabili e la vostra azienda ne subirà le conseguenze. In alternativa, se capite i casi d’uso del vostro software e ciò che i vostri utenti stanno cercando di realizzare, il vostro software sarà migliore, più sicuro, e potrete limitare le email “Ci dispiace…” ai vostri clienti.

Per ulteriori letture

Da qui possiamo continuare ad approfondire i protocolli, le singole librerie o i grandi libri sull’argomento. Se volete capire come le singole RFC si adattano tra loro, date un’occhiata al libro di Aaron Parecki OAuth2.0 Simplified e alla sua mappa di accompagnamento delle specifiche OAuth 2.0. È il mio foglio di calcolo per i link alle specifiche chiave e quale copre cosa. Tutto ciò ha ispirato la mia guida per le Pratiche raccomandate per la gestione dell’accesso alle API che dettaglia i principi di buona progettazione e sviluppo per i client OAuth, i server di autorizzazione, i gateway API e le vostre applicazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *