Molte API (servizi) oggi utilizzano OAuth, l'autenticazione di base HTTP o le chiavi API per autenticare i loro utenti.
Il mio obiettivo è trovare un modo semplicistico sicuro per autenticare gli utenti in un'applicazione client-side in un stateless modo per un servizio .
Metodi di autenticazione
Ecco la mia vista su alcuni dei metodi di autenticazione:
-
OAuth sembra un'ottima soluzione, ma sembra molto complicato per l'impostazione e sembra eccessivo per un solo servizio.
-
In base a OWASP " l'autenticazione di base HTTP non è sicura e non dovrebbe essere usato nelle applicazioni ".
-
L'utilizzo di semplici chiavi API in un'applicazione web lato client non lo fa sembra un miglioramento rispetto all'autenticazione di base HTTP.
Utilizzo di token crittografati
La mia idea alternativa è di utilizzare token crittografati che possono essere verificati dal servizio.
- Il testo in chiaro del token conterrà il nome utente , password & la data di scadenza del token.
-
Il testo in chiaro verrà crittografato usando a chiave segreta che è conosciuta solo dal server.
-
Il testo in chiaro sarà crittografato sul server utilizzando AES in modalità GCM , in modo che l'integrità non possa essere manipolata.
L'utente deve accedere con il proprio nome utente e password per ricevere un token . Questo token è inviato su ogni richiesta e può essere verificato sul server.
Per illustrare:
+----------+ +-----------+
| +------ Login with user:pass ---->+ |
| Client | | API |
| +<---- Send encrypted token ----| |
| | | |
| +------ Use token to authenticate ---->+ |
+----------+ +-----------+
Verifica
La verifica può essere effettuata da:
- Decrittografa il token utilizzando la chiave segreta .
- Verifica nome utente e password .
- Verifica se il token è scaduto .
della Pro
Possibili pro di questo approccio:
- I token possono essere memorizzati in localStorage per mitigarli dagli attacchi CSRF e gli utenti sono in grado di disconnettersi cancellando il localStorage.
- Le informazioni di accesso in testo normale non vengono inviate su ogni richiesta.
- I token possono scadere.
Contro
Possibili contro di questo approccio:
- Più carico sul server decifrando ogni richiesta.
- Un token è associato a un server specifico.
Quale pensi sia una buona soluzione? Conosci altre buone alternative?