2017-05-30 11 views
0

Ich versuche, Passports in meiner Nodejs App mit Express4 zu verwenden. Zu Testzwecken verwende ich Session-File-Store, um die Sitzung zu behalten.Session Probleme mit Passportjs

Die Art, wie ich die Sitzung und passportjs einzurichten:

this.app.use(session({ 
    secret: process.env.SESSION_SECRET || configuration.session_secret, 
    store: new fileStore(), 
    resave: false, 
    saveUninitialized: false 
})); 

// config authentication 
this.app.use(passport.initialize()); 
this.app.use(passport.session()); 
// Configure Passport 
passport.use('local-login', new localStrategy.Strategy(
    (username, password, done) => { 
     Services.users.authenticatePromise(username, password).then(
      function(token) { 
      done(null, token); 
      }, 
      function(err) { 
      done(null, false, err); 
      }, 
    ).done(); 
    }, 
)); 
    // Serialize user in session 
passport.serializeUser((token: AccessToken, done) => { 
    let user = { 
    _token: token.accessToken, 
    _expiryInAt: token.expiryInMs + new Date().getTime(), 
    }; 
    done(null, user); 
}); 

passport.deserializeUser((sessionUser, done) => { 
    done(null, sessionUser); 
}); 

jedoch das Problem, das ich habe, ist, dass, wenn ich nicht alles in die Sitzung schreiben, bevor Benutzer angemeldet ist, passportjs funktioniert gut. Wenn ich jedoch versuche, einige Daten in die Session zu schreiben, wie z. B. Einkaufswagendetails, ist es passwords nicht mehr möglich, das Benutzer-Token in den Sitzungsspeicher zu serialisieren. Die Anmeldung kann nicht erfolgreich sein.

Was fehlt mir?

+0

Sie tun 'req.session = {...}' oder etwas ähnliches? I.e. Überschreiben des gesamten Sitzungsobjekts mit etwas Neuem. – robertklep

+0

Nein, ich habe etwas wie: '' 'if (! Req.session ['basket']) { req.session ['basket'] = {}; } '' ' – rzhomx

+0

Ah Entschuldigung, das sollte sowieso nicht das Problem sein, da es nicht serialisiert. Können Sie die Implementierungen für "pass.serializeUser/deserializeUser" zu Ihrer Frage hinzufügen? Was bedeutet _ "nicht in der Lage zu serialisieren" _ genau? – robertklep

Antwort

0

Sie haben ein paar Dinge falsch mit Ihrem Code, den ich sehen kann.

erste, serializeUser sollte ein Objekt nehmen und eine Zeichenfolge zurückgeben (in der Regel eine eindeutige ID oder ein Datenbankschlüssel). Ihre Funktion nimmt derzeit eine Zeichenfolge und gibt ein Objekt zurück; das ist rückwärts.

zweite, deserializeUser sollte eine Zeichenfolge nehmen und ein Benutzerobjekt zurückgeben. Ihre Funktion nimmt derzeit ein Objekt und gibt dasselbe Objekt zurück.

schließlich, serializeUser und deserializeUser müssen Inversen voneinander sein; Bedeutung, Pass kann deserializeUser(serializeUser(user)) aufrufen und das ursprüngliche Benutzerobjekt zurückbekommen.

Sie gehen also so etwas wollen:

passport.serializeUser((user, done) => { 
    return user.id; 
}); 

passport.deserializeUser((id, done) => { 
    getUserFromDatabase({id: id}, function(err, user) { 
    if (err) { 
     done(err, null); // something went wrong; return error 
    } else if (!user) { 
     done(null, false); // no user found; return `false` 
    } else { 
     done(null, user); // return user 
    } 
    }); 
}); 

für weitere Informationen hier sehen: Understanding passport serialize deserialize

+0

Sie haben Recht. Es ist sicherlich nicht die beste Praxis, aber ich denke, das ist nicht der Grund für das Problem, das ich sehe. Erstens, wenn ich vor dem Login nichts in die Sitzung schreibe, funktioniert dieser serializeUser/deserializeUser einwandfrei. Es kann den Benutzer in den Sitzungsspeicher serialisieren und es deserialisieren. Und ich versuche nur, API-Token statt Benutzer-ID mit Passjs zu verwenden, jede bessere Lösung, die ich nehmen kann? – rzhomx

Verwandte Themen