2016-04-07 11 views
0

Diese Frage bezieht sich nur halb auf meinen Code und die Hälfte auf die High-Level-Ansicht, in der tatsächlich Daten für einen bestimmten Benutzer von einer Node-API abgerufen werden.Daten für Benutzer basierend auf JWT in Node/Express erhalten

Also ich habe Benutzer Anmeldung/signin alles funktioniert gut, und lassen Sie sagen, ich habe eine Eins-zu-viele Zuordnung zwischen Benutzer und Widgets, so kann jeder Benutzer Widgets von seiner oder ihrer Profilseite erstellen und löschen.

hier sind also meine Datenbank Modelle:

var User = new mongoose.Schema({ 
    email: { 
    type: String, 
    unique: true, 
    required: true 
    }, 
    hash: String, 
    salt: String 
    widgets : [{ type: Schema.Types.ObjectId, 
      ref: 'widget' 
      }], 
}); 

var Widget = new mongoose.Schema({ 
    name   : String, 
    type   : String, 
    description : String, 
}); 

Im User-Login-Prozess, ich JWT erzeugen und verwenden, die eine Genehmigung Header auf dem Front-End zu speichern.

Jetzt ist meine Frage zweifach. 1) Wie speicher ich Widgets korrekt, so dass sie mit dem aktuell angemeldeten Benutzer verknüpft sind? und 2) Wie bekomme ich alle mit einem Benutzer verbundenen Widgets?

Meine ersten Gedanken sind so etwas wie folgt aus:

app.get('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // run database query to return all widgets associated with user email 
}); 

app.post('api/widgets', function(req, res, next){ 
    // decode authorization header to get user email 
    // create widget and update user with widget ID 
}); 

Ist dies die richtige Idee? Und wenn ja, wie würde ich den Autorisierungsheader dekodieren, um die E-Mail des Benutzers zu erhalten? Muss ich für alle Objekte, die dem Benutzer zugeordnet sind, denselben Prozess durchlaufen? Oder gibt es eine schnellere und bequemere Möglichkeit, dies in Node/Express zu tun?

+0

Ja, können Sie Benutzer Widgets Daten in jwt speichern, aber Sie werden es brauchen zu aktualisieren, nachdem jedes Add/Widget Betrieb entfernen, und es wird eine zusätzliche Logik erfordern neue jwt mit dem Client zu synchronisieren. Am einfachsten ist es, die Sitzung zu verwenden. – alexmac

+0

Sorry, nicht sicher, ob ich in der ursprünglichen Frage klar war. Ich möchte die Widget-Daten nicht im JWT speichern. Ich speichere nur die Benutzer-E-Mail im JWT.Mit "Benutzer mit Widget-ID aktualisieren" meinte ich, den Benutzer in der Datenbank mit der Widget-ID zu aktualisieren. – jmknoll

+0

Ich denke, das ist der richtige Weg. Wenn Sie eine Bibliothek zum Verschlüsseln des JWT-Tokens verwenden, hat es höchstwahrscheinlich auch eine Dekodierungsfunktion. Um das Widget zu speichern, verwenden Sie einfach die Speichern-Funktion des Widget-Modells 'neues Widget ({Name ....}) .Save (Funktion (Fehler, Widget) {Aktualisiere den Benutzer hier mit $ Push-Operator})' dann Widgets für den Benutzer zu verwenden 'User.findOne (id) .populate ('widgets'). Exec (function (err, user)) {user hier hat ein Array von Widgets, nicht ids, sondern tatsächliche Objekte aus der Widget-Sammlung});' – Molda

Antwort

2

Ist das die richtige Idee?

Meiner Meinung nach, ja, das ist richtig.

Und wenn ja, wie würde ich den Autorisierungsheader entschlüsseln, um die E-Mail des Benutzers zu erhalten?

Wenn Sie jsonwebtoken Paket verwenden, gibt es eine verify Methode, die das Token decodiert. Sie können sogar mehrere Werte in einem einzelnen Token speichern, z. B. E-Mail und Name. verify wird das Token in ein Objekt mit beiden Eigenschaften dekodieren.

Muss ich für jedes Objekt, das dem Benutzer zugeordnet ist, denselben Prozess durchlaufen? Oder gibt es eine schnellere und bequemere Möglichkeit, dies in Node/Express zu tun?

Das Laden dieser Objekte bei jeder Anforderung ist wahrscheinlich die gebräuchlichste Methode. Wenn Sie feststellen, dass dieser Ladevorgang die Anwendung verlangsamt, können Sie sie zwischen node-cache oder Redis zwischenspeichern (empfohlen, wenn Sie einen verteilten Anwendungscluster haben).

Ich schlage auch vor, dass, anstatt das Token des Benutzers in eine E-Mail auf jeder Route zu decodieren, ist es üblich, eine catch all route zu verwenden, die das Token dekodiert und in der locals speichert. TROCKEN!

app.use(function (req, res, next) { 
    var token = req.signedCookies.token 
    res.locals.user = jwt.verify(token, 'my-secret') 
    next() 
}) 
+0

Danke. Das war sehr hilfreich. – jmknoll

Verwandte Themen