2016-01-30 29 views
5

Ho lavorato con Sails da un paio di settimane, sono venuto da Rails e non ho alcuna esperienza con Node.js.Come ottenere l'utente corrente usando jsonwebtoken in Sails.js?

Ora sto provando a creare un'autenticazione token affidabile utilizzando jsonwebtoken. https://github.com/auth0/node-jsonwebtoken

Ho seguito questa guida http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/ e tutto ha funzionato bene. Sono in grado di registrarmi, accedere e utilizzare il token correttamente per diverse azioni.

Ora, ci sono alcune azioni in cui mi piacerebbe utilizzare l'utente di login, qualcosa come l'assistente di deviazione current_user. Ad esempio, quando si crea un commento, questo commento dovrebbe appartenere all'utente corrente.

Utilizzando la guida di Sabbir Ahmed, nella riga 33 della politica isAuthorized.js, il token viene decifrato in modo da poter ottenere l'id utente corrente da lì.

Quindi, la mia domanda è, quale dovrebbe essere il modo migliore per ottenere l'utente corrente e poterlo utilizzare in seguito in qualche controller? Per esempio ho provato qualcosa di simile:

# isAuthorized.js line 34, after getting decrypted token 
User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    currentUser = found; 
}); 

Ma, in questo modo, perché si tratta di un'azione asincrona Non posso usare questo currentUser in un controllore.

Desidero memorizzare l'utente corrente per poterlo utilizzare in seguito in alcuni controller senza ripetere lo stesso codice in ogni controller, qualcosa come un helper o forse un servizio.

risposta

4

Il trucco è dove si posiziona il next(). Poiché si sta effettuando una chiamata asincrona, il controllo deve essere trasferito alla politica/al controllore successivo una volta che l'azione del database è in competizione.

Si dovrebbe modificare la politica:

User.findOne({id: token.id}).exec(function findOneCB(err, found){ 
    if(err) next(err); 
    req.currentUser = found; 
    next(); 
}); 

E si dovrebbe essere in grado di accedere ai dettagli di utente nel controller che utilizzano isAuthorized politica tramite req.currentUser

0

Se per

Per esempio , quando si crea un commento, questo commento dovrebbe appartenere all'utente corrente.

quello che vuoi dire è certi attributi come nome utente, e il paese ecc, piuttosto che interrogare il database dopo la verifica, ciò che si può scegliere di fare è quello di inviare questi attributi aggiuntivi per jwToken.issue in api/controllers/UsersController.js

es.

jwToken.issue({ 
    id: user.id, 
    username: user.name, 
    country: user.country 
    }) 

Come che aiuta è, è possibile mantenere api/policies/isAuthorized.js come è, e in tutti i controllori che si utilizza in futuro, è possibile accedere ai valori di carico utile da come

token.username or token.country 

Invece di dover interrogare nuovamente il database, risparmiando così tempo prezioso di risposta.

Attenzione però, dei dati si sceglie di inviare nel token (si può anche inviare {user: user}, se si vuole), tuttavia, come la chiave segreta o hashing non è richiesto per decifrare il payload come puoi capire @jwt.io, potresti voler esercitare il contenimento.