Devo implementare un'autenticazione basata su token per un servizio web RESTful. Questa è la prima volta che implemento funzionalità di sicurezza in un software, e questo è quello che ho in mente per ora:
- Il client prima autentica tramite un modulo di accesso (nell'applicazione client) con la sua e-mail e password.
- Se l'autenticazione ha successo, l'utente riceverà in risposta una chiave privata (generata casualmente) e un token (stringa - generata casualmente?). Il server memorizzerà nella db (o forse una cache?) Una tupla con i seguenti campi (email, chiave privata, hashedToken, scadenza del token), dove hashedToken è il valore dell'HMAC calcolato sul token, con chiave privata .
- Il client memorizza la chiave privata ricevuta e il token (in memoria).
- Per ogni richiesta futura, il client includerà in un'intestazione personalizzata (ad esempio authToken) il valore dell'HMAC calcolato sul token, con chiave privata e l'e-mail dell'utente (in un'altra intestazione) e sostituirà il token memorizzato in memoria con il token appena generato.
- Quando il server riceve la richiesta, controlla la tupla matematica dell'indirizzo email, controlla se il token memorizzato e il token ricevuto sono uguali e se il token non è scaduto. Se è ok, il server aggiorna la data di scadenza della tupla e il campo hashedToken è impostato sul valore di HMAC calcolato sul vecchio token, con chiave privata. il server elabora quindi la richiesta. (nessun intestazione di autenticazione aggiuntiva o informazioni incluse nella risposta)
I passaggi 1 e 2 utilizzeranno HTTPS. Altre richieste verranno inviate da HTTP, dal momento che un nuovo token viene generato dopo ogni richiesta di successo (il sniffing del token sarebbe inutile per un utente malintenzionato, penso).
Vorrei sapere quali sono i problemi con questo protocollo di autenticazione e come potrebbe essere migliorato.
Inoltre, questo approccio sarebbe più veloce del semplice includere l'e-mail e la password in un'intestazione in ogni richiesta e utilizzando HTTPS?