Attualmente sto scrivendo un servizio web che verrà utilizzato da un'app Android.
Per accedere al contenuto specifico dell'utente, è necessario autenticarsi con il servizio.
Dal momento che non utilizzo (principalmente) un browser web per effettuare chiamate alla mia API, un'autenticazione basata su una sola sessione non è un'opzione.
Non voglio nemmeno trasmettere le credenziali degli utenti ad ogni chiamata, quindi ho deciso di utilizzare un JWT [ 1 ] autenticazione basata.
Modifica: alcuni altri dettagli
Il webservice è in esecuzione su node.js.
I seguenti moduli svolgono un ruolo chiave nel contesto della domanda: express viene utilizzato per gli endpoint, passport per l'autenticazione, jwt-simple per generare token. Non direttamente rilevante per la domanda ma coinvolto nel processo è bcrypt-nodejs per la crittografia e sequelize per interrogare il database, per il quale viene utilizzato postgresql .
Finora, il processo ha il seguente aspetto - utilizzando gli endpoint di esempio
- Viene effettuata una prima chiamata a
/api/auth/login/
, passando il nome utente e la password dell'utente che effettua l'autenticazione. - L'API restituisce le informazioni degli utenti memorizzate nel database, insieme a un token. per esempio.
{success: true, user: {id: 42, token: aaa.bbb.ccc}}
- Qualsiasi richiesta successiva passa detto token come parametro di query per autenticare lo stesso utente.
La domanda che sorge ora è: Come correlare il token con un utente e verificarne la validità.
Le opzioni che vedo sono le seguenti.
-
Poiché il token contiene un payload, è in realtà sufficiente inserire l'ID utente in esso e presupporre che se il token decodifica correttamente è valido e la chiamata API verrà effettuata con i privilegi dell'utente il cui id è contenuto nel payload.
- Poiché il token è codificato utilizzando un segreto noto solo al server, non dovrebbe essere possibile simulare un token, a meno che qualcuno non ottenga le sue mani sul segreto.
- possono essere inclusi anche altri sinistri come
exp
oiat
.
-
Al momento della generazione del token, verrà aggiunto a una tabella
tokens
che contiene il token e il relativo ID utente corrispondente (id | user_id | token
). Quando viene effettuata una richiesta, il database verrà interrogato per l'esistenza del token e solo se esiste una voce, verrà utilizzato il suouser_id
.
Per farla breve, la mia domanda si scompone in questi:
-
È necessario / audio aggiungere il token a un database o posso semplicemente utilizzare il payload per identificare l'utente?
-
Ha senso cambiare i server segreti - usati per codificare il token - circa ogni settimana, quindi invalidare qualsiasi token generato in precedenza?
- Utilizzando questo approccio, è necessario eseguire una query aggiuntiva sul database su ogni singola richiesta.
[1] - link