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
Cipher
password sono note, questi token possono essere falsificati. -
Ho preso in considerazione l'utilizzo di
password
invece disalt
ehash
, ma non mi piaceva l'idea chepassword
fosse 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?