Autenticazione del servizio Web basata su JWT

2

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

  1. Viene effettuata una prima chiamata a /api/auth/login/ , passando il nome utente e la password dell'utente che effettua l'autenticazione.
  2. 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}}
  3. 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.

  1. 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 o iat .
  2. 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 suo user_id .

Per farla breve, la mia domanda si scompone in questi:

  1. È necessario / audio aggiungere il token a un database o posso semplicemente utilizzare il payload per identificare l'utente?

  2. 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

    
posta C5H8NNaO4 28.08.2015 - 16:29
fonte

2 risposte

1

Il tuo token deve contenere l'id utente e un hash. Se l'hash corrisponde alla JWT, stai bene (a patto che nessuno conosca la chiave privata che stai usando per creare quell'hash).

    
risposta data 28.08.2015 - 17:58
fonte
1

Is it necessary/sound to add the token to a database or can I just use the payload to identify the user?

Penso che entrambi gli approcci vadano bene. Ho implementato l'autenticazione basata su token in .Net e abbiamo inserito tutte le informazioni relative all'identità nel token. Direi che è più scalabile, specialmente per una web farm. Tutte le informazioni di autenticazione di cui abbiamo bisogno si trovano nel token stesso, quindi non abbiamo bisogno di chiedere al database ulteriori informazioni. Ma la dimensione del token potrebbe essere potenzialmente molto grande. Un altro problema è che non è facile implementare il logout. Il token è valido fino alla sua scadenza, non è facile revocarlo. Vedi qui .

Puoi anche inserire le informazioni richieste nel database. E il token stesso contiene solo qualcosa come un "id di sessione". Ora è più simile a un'autenticazione basata su cookie tradizionale. Tuttavia, devi affrontare altri problemi come dove archiviare le informazioni di sessione (cache o database), utilizzare un database di sessione condiviso o ogni macchina mantiene i propri dati di sessione, ecc.

    
risposta data 28.08.2015 - 21:57
fonte

Leggi altre domande sui tag