Attualmente sto progettando un REST-API con le seguenti proprietà:
- Backend per un'applicazione a singola pagina (Applicazioni successive)
- Database utente integrato per ogni istanza
- Solo HTTPS / TLS
- Autenticazione con una combinazione nome utente / password
Il mio approccio attuale per il processo di autenticazione è il seguente:
- (Client) POST Username e password a
/api/users/action/auth
- (server) Autentica utente, genera token, invia token al client
- (Cliente) Utilizza l'intestazione di autorizzazione con token per la richiesta successiva
- (Cliente) DELETE
/api/users/action/auth
per invalidare il token
Il token scadrà dopo un certo periodo di inattività.
Ho scelto questo design perché non mi piace l'idea di archiviare i dati di autenticazione semplici sul dispositivo client.
Leggendo molte altre domande e articoli su questi argomenti, non penso che questo approccio sia il migliore. Sono sorte le seguenti domande:
- La generazione e l'utilizzo di token per le richieste successive violano il principio stateless di REST?
- Questa procedura è sicura? (XSRF?)
- Esiste un approccio di progettazione migliore? Ho pensato che OAuth potrebbe essere un overkill
EDIT:
Riguardo a "sicuro":
L'applicazione conterrà molte informazioni sensibili, quindi la sicurezza è molto importante. Supponendo che l'uso sicuro di HTTPS (solo TLS, gruppo DH strong, nessuna mod di esportazione, ecc.) Ci siano problemi di sicurezza facili da utilizzare in questo approccio?
Riguardo a "migliore":
Ho scelto questo modello perché è facile da implementare su entrambi i lati. Ho pensato di usare HMAC(token, 'POST' || '/api/resource' || timeInterval)
come token per ogni richiesta, la mia conclusione è stata che ciò avrebbe aggiunto complessità inutili senza migliorare la sicurezza. (Già usando TLS)