2016-01-30 17 views
5

Ich arbeite seit einigen Wochen mit Sails, ich kam von Rails und habe keine Erfahrung mit Node.js.Wie bekomme ich den aktuellen Benutzer mit jsonwebtoken in Sails.js?

Jetzt versuche ich eine robuste Token-Authentifizierung mit jsonwebtoken zu machen.

Ich folgte dieser Anleitung http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/ und alles hat gut funktioniert. Ich kann mich anmelden, anmelden und das Token dann für verschiedene Aktionen verwenden.

Jetzt gibt es einige Aktionen, wo ich den Login-Benutzer, etwas wie Devise current_user Helfer verwenden möchte. Wenn Sie beispielsweise einen Kommentar erstellen, sollte dieser Kommentar dem aktuellen Benutzer gehören.

Mit Sabbir Ahmed Anleitung, in der Zeile 33 von der IsAuthorized.js Richtlinie das Token entschlüsselt, so kann ich die aktuelle Benutzer-ID von dort bekommen.

Also, meine Frage ist, was sollte der beste Weg sein, den aktuellen Benutzer zu bekommen und in der Lage sein, es später in einem Controller zu verwenden? Zum Beispiel habe ich versucht, so etwas wie:

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

Aber auf diese Weise, denn dies ist eine Asynchron-Aktion ist ich nicht diese current in einem Controller verwenden kann.

Ich möchte den aktuellen Benutzer speichern, um in der Lage zu sein, es später in einem Controller zu verwenden, ohne den gleichen Code in jedem Controller, etwas wie einen Helfer oder vielleicht einen Dienst zu wiederholen.

Antwort

4

Der Trick ist, wo Sie die next() platzieren. Da Sie einen asynchronen Aufruf durchführen, sollte das Steuerelement erst zur nächsten Richtlinie/zum nächsten Controller übertragen werden, sobald die Datenbankaktion abgeschlossen ist.

Sie sollten die Richtlinie ändern:

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

Und Sie sollten die Benutzerdaten in Controller zugreifen können, die req.currentUser

0

Wenn von

Zum Beispiel über isAuthorized Politik verwenden Beim Erstellen eines Kommentars sollte dieser Kommentar dem aktuellen Benutzer gehören.

, was du meinst sind bestimmte Attribute wie Benutzername und Land usw., anstatt die Datenbank nach Überprüfung abfragen, was Sie tun können wählen, ist diese zusätzlichen Attribute jwToken.issue in api/controllers/UsersController.js

senden

z.

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

Wie das hilft, ist, Sie api/policies/isAuthorized.js wie es ist zu halten, und in allen Controllern, die Sie in Zukunft verwenden, können Sie die Nutzlastwerte zugreifen als

token.username or token.country 

anstatt zu Abfragen Sie die Datenbank erneut und sparen Sie wertvolle Antwortzeit.

aber Vorsicht, die Daten, die Sie in dem Token senden (Sie können auch senden könnten {user: user} wenn Sie wollen) jedoch als den geheimen Schlüssel oder Hashing ist nicht erforderlich, um die Nutzlast zu entschlüsseln als Sie können @jwt.io, möchten Sie vielleicht Zurückhaltung üben.

Verwandte Themen