Ho avuto lo stesso problema che descrivi. Il sito web che sto costruendo è accessibile da un telefono cellulare e dal browser, quindi ho bisogno di un API per consentire agli utenti di registrarsi, accedere e svolgere alcune attività specifiche. Inoltre, ho bisogno di supportare la scalabilità, lo stesso codice in esecuzione su diversi processi / macchine.
Poiché gli utenti possono CREARE risorse (ovvero azioni POST / PUT), è necessario proteggere le API. Puoi usare oauth o puoi creare la tua soluzione, ma tieni presente che tutte le soluzioni possono essere rotte se la password è davvero facile da scoprire. L'idea di base è autenticare gli utenti usando username, password e un token, ovvero l'apitoken. Questo apitoken può essere generato usando node-uuid e la password può essere hash usando pbkdf2
Quindi, è necessario salvare la sessione da qualche parte. Se lo salvi in memoria in un oggetto semplice, se uccidi il server e lo riavvii di nuovo, la sessione verrà distrutta. Inoltre, questo non è scalabile. Se si utilizza haproxy per il bilanciamento del carico tra macchine o se si utilizzano semplicemente i lavoratori, questo stato della sessione verrà memorizzato in un singolo processo, quindi se lo stesso utente viene reindirizzato a un altro processo / macchina, sarà necessario eseguire nuovamente l'autenticazione. Pertanto è necessario archiviare la sessione in un luogo comune. Questo in genere viene fatto usando redis.
Quando l'utente viene autenticato (nome utente + password + apitoken) genera un altro token per la sessione, noto anche come accesstoken. Ancora una volta, con node-uuid. Invia all'utente accesstoken e userid. Userid (chiave) e accesstoken (valore) vengono memorizzati in redis con e scadono il tempo, ad es. 1h.
Ora, ogni volta che l'utente esegue qualsiasi operazione utilizzando l'API rimanente, dovrà inviare userid e accesstoken.
Se consenti agli utenti di registrarsi utilizzando l'API rimanente, dovrai creare un account amministratore con un amministratore apitoken e memorizzarli nell'app mobile (crittografare nome utente + password + apitoken) perché i nuovi utenti non avranno un apitoken quando si iscrivono.
Anche il web usa questa API ma non è necessario usare apitokens. Puoi usare express con un redis store o usare la stessa tecnica descritta sopra ma aggirando il controllo apitoken e restituendo all'utente userid + accesstoken in un cookie.
Se si dispone di aree private, confrontare il nome utente con gli utenti consentiti durante l'autenticazione. È inoltre possibile applicare ruoli agli utenti.
Sommario:
Un'alternativa senza apitoken sarebbe quella di utilizzare HTTPS e di inviare il nome utente e la password nell'intestazione dell'autorizzazione e memorizzare nella cache il nome utente in redis.