Dove devo conservare i token di accesso OAuth2?

12

Sto creando un back-end API REST, per un'applicazione mobile. Nella nostra scelta progettuale, abbiamo deciso di consentire ai provider di OAuth2 di gestire la sicurezza di accesso.

Tuttavia, non sono sicuro di quale sia la migliore pratica per il token di accesso, che acquisisco dai provider OAuth2.

La situazione è che ottengo un token di accesso dal provider OAuth2, quando l'utente effettua un accesso. Dovrò utilizzare questo token, ogni volta che l'applicazione mobile effettua una richiesta al mio back-end. Quindi posso validare il provider OAuth2, per vedere se il token è ancora valido.

So che creerò una JWT e la passerò all'applicazione mobile, che userà ogni volta che farà una richiesta.

Ora la mia domanda è, dovrei memorizzare il token di accesso che ho ricevuto dal provider OAuth2, all'interno del JWT come attestazioni.
O dovrei memorizzarlo in un database e collegarlo con l'ID utente, che memorizzerò nelle richieste JWT?

Forse si consiglia di crittografare il JWT, con JWE? In tal caso, diminuirà le prestazioni se decifro per ogni richiesta, piuttosto che eseguire una ricerca nel database (userò MongoDB o Redis) o l'impatto sulle prestazioni sarà lo stesso?

La connessione alla mia API REST, avverrà tramite HTTPS.

    
posta Daniel 10.02.2016 - 13:15
fonte

2 risposte

8

Se la richiesta all'API di terze parti passa attraverso il server, quindi archiviare il token di accesso nel database collegato all'utente, crittografato con una chiave memorizzata come variabile di ambiente. Se il database è compromesso, i token sono sicuri. (Bonus, crittografare i token con una chiave che viene generata e archiviata nell'app mobile.)

Se la richiesta all'API di terze parti è direttamente dall'app mobile, archivia il token di accesso sul telefono, crittografato con una chiave univoca per ogni utente memorizzato nel database del tuo server. La memorizzazione decentralizzata di informazioni sensibili è più sicura rispetto all'archiviazione centralizzata (compartimentalizzazione). Se il telefono viene rubato, richiede l'autenticazione sul server prima che sia possibile ottenere la chiave di decrittografia. Se il tuo server è compromesso, i token non ci sono.

Non ho usato JWT.

    
risposta data 10.02.2016 - 21:09
fonte
1

I token di accesso sono secondo la RFC che si suppone siano ad accesso limitato. Piuttosto che preoccuparsi di dove archiviare qualcosa di alto valore in cui il server potrebbe essere compromesso, è meglio limitare semplicemente la durata dell'accesso al token.

Questo è specificatamente indicato nella RFC per i token al portatore:

Issue short-lived bearer tokens: Token servers SHOULD issue short-lived (one hour or less) bearer tokens, particularly when issuing tokens to clients that run within a web browser or other environments where information leakage may occur. Using short-lived bearer tokens can reduce the impact of them being leaked.

    
risposta data 11.02.2016 - 21:01
fonte

Leggi altre domande sui tag