Sto cercando di implementare l'autenticazione REST stateless in un'API. Ho letto gli articoli qui e ho implementato un'idea che funziona, ma speravo di ottenere un feedback sulla sua sicurezza e su eventuali miglioramenti.
-
L'autenticazione iniziale avviene tramite l'autenticazione di base HTTPS. Username e password sono forniti in testo semplice.
-
Il server genera e fornisce un token fornito al client, ma non è archiviato nel database. Tutti gli articoli che ho letto sui token auth suggeriscono di memorizzare non il token stesso , ma alcuni valori che possono essere sottoposti a hash con un altro valore (il nome utente, ecc.) Per generare nuovamente il token e convalidarlo - ma io pensavo che il punto di un'API REST fosse stateless, e not non memorizza alcun token / valore correlato all'autore?
-
Questo token viene quindi utilizzato per richieste successive al posto di richiedere sempre il nome utente / password nelle intestazioni.
Il token
Il token è generato usando:
encrypt(username, salt, hash, expirationDate)
Dove encrypt è reversibile usando attualmente un DES Cipher , ma in futuro probabilmente una chiave privata o una risorsa memorizzata sul server che può essere facilmente sostituita senza fare affidamento su un valore nel codice sorgente .
Il vantaggio è che questo consente al server di decrittografare il token in entrata e confrontare il sale / hash con ciò che è memorizzato nell'oggetto modello User . (Che ha salt e hash proprietà memorizzate nel database.)
Le preoccupazioni che ho con questo:
-
Se la chiave privata o la
Cipherpassword sono note, questi token possono essere falsificati. -
Ho preso in considerazione l'utilizzo di
passwordinvece disaltehash, ma non mi piaceva l'idea chepasswordfosse noto se si trova la chiave privata o la passwordCipher.
Quindi: c'è un modo migliore per fare questo tipo di autenticazione con codice "decryptable"? E vale la pena mantenere questo obiettivo "stateless" di REST, o dovrei semplicemente memorizzare una versione hash del token e username (ma not il token stesso) nel database e lanciare l'apolide auth "idea fuori dalla finestra?