Sto provando a progettare un servizio web RESTful API sicuro con il minor numero di parti mobili possibile. Ho alcune domande e voglio assicurarmi che il mio design sia sicuro.
Per il livello di sicurezza della trasmissione dei dati, userò SSL / TLS per evitare intercettazioni, MITM, attacchi di riproduzione, ecc.
Ciò che lascia è il controllo degli accessi.
Non desidero combattere con OAuth. Il motivo è che non voglio fare affidamento su una terza parte e configurare server locali in quanto "autenticatore" (o qualsiasi altra cosa OAuth lo chiami) non è fattibile.
Quindi ho deciso di affidarmi a un token casuale. Utilizzando una libreria CSPRNG (ad es., $token = random_bytes(32)
in PHP), ho in programma di assegnare ogni nome utente / password a $token
e di memorizzarlo nel DB utilizzando una funzione di memorizzazione password (ad esempio, PBKDF2 o bcrypt). Il token verrebbe anche recuperato dall'utente tramite SSL / TLS.
Quindi, a ogni richiesta, l'utente invierà il token insieme ai propri dati JSON. Se il token che passano esiste nel DB, la chiamata API viene elaborata.
Questo mi lascia alcune domande:
- Il token può essere coerente (a meno di revoca o aggiornamento manuale) oppure il token richiede di essere "aggiornato" frequentemente? Se sì, qual è il modo fattibile per gestirlo? Costringere l'utente ad accedere a una pagina Web per ottenere l'accesso al nuovo token sembra vanificare lo scopo di un'API. Questo sembra indicare che è nel migliore dei casi un punto controverso.
- Qual è il vantaggio di mettere il token in un'intestazione HTTP (ad esempio
Authorization: Token SOMERANDOMVALUE
) anziché semplicemente inserirlo nel corpo di una richiesta JSON? Ad ogni modo, non farò nulla con la richiesta a meno che l'autenticazione non abbia successo. Stavo per metterlo nell'intestazione in ogni caso, ma ero solo curioso.
Inoltre, se qualcuno ha fonti attendibili per saperne di più sulla creazione di API sicure, mi piacerebbe davvero leggerle.