2016-04-11 3 views
1

Ich habe dieses Problem, bei dem eine Sitzung erstellt wird, unabhängig davon, ob der Benutzer angemeldet ist oder nicht.Wie gebe ich die Sitzung nur wenn authentifiziert? Jede andere Middleware-Bestellung funktioniert nicht

Ich möchte es, wenn eine Sitzung nur erstellt wird, wenn der Benutzer erfolgreich anmeldet. Andernfalls, wenn ein Selen-Bot trifft ... zum Beispiel würde die Route route('/users/:username') meine Sitzung Sammlung mit Sitzungen füllen, die nicht von echten Benutzern sind. Ich lasse meine Benutzer für immer angemeldet bleiben, so dass der Sitzungscookie auf ein Jahr eingestellt ist ... was noch schlimmer ist, wenn die Sitzung nicht zu einem echten Benutzer gehört.

Wie kann ich eine Sitzung nur dann an den Client zurückgeben, wenn die Authentifizierung erfolgreich war? Ich habe verschiedene Reihenfolge der Routen und Middleware versucht, aber das ist die einzige Reihenfolge, die richtig funktioniert.

app.use(session({ 
    secret: 'bob', 
    saveUninitialized: true, 
    resave: true, 
    name: 'curves', 
    cookie: { secure: false, httpOnly: false, 
    maxAge: 365 * 24 * 60 * 60 * 1000 }, 
    store: new MongoStore(storeOptions) 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 

app.use('/', auth); 
app.use('/api/v1', router); 

// isLoggedIn WOULD NOT WORK IF I PLACED THIS BEFORE PASSPORT/SESSION MIDDLEWARE 
router.route('/users/:username') 
    .get(isLoggedIn, api.getUsername); 

auth.route('/auth/facebook') 
    .get(passport.authenticate('facebook', { scope : 'email' })); 

auth.route('/auth/facebook/callback') 
    .get(function(req, res, next) { 
    passport.authenticate('facebook', function(err, userDoc, info) { 
     if (err) { return next(err); } 
     // I don't think !userDoc will ever happen because of mongo upsert 
     if (!userDoc) { return res.redirect('/login'); } 
     req.logIn(userDoc, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('http://localhost:9000/users'); 
     }); 
    })(req, res, next); 
}); 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.status(404).json({ error: "not logged in" }); 
} 

Antwort

1

es heraus ... Ich saveUninitialized: false setzen gerade benötigt wird.

saveUninitialized Erzwingt die Speicherung einer nicht initialisierten Sitzung im Geschäft. Eine Sitzung wird nicht initialisiert, wenn sie neu, aber nicht geändert wird. Die Auswahl von false ist nützlich für die Implementierung von Anmeldesitzungen, die Reduzierung der Serverspeicherauslastung oder die Einhaltung von Gesetzen, die eine Erlaubnis erfordern, bevor ein Cookie gesetzt wird. Die Auswahl von false hilft auch bei Rennbedingungen, bei denen ein Client mehrere parallele Anfragen ohne Sitzung durchführt.

Der Standardwert ist true, aber die Verwendung der Standardeinstellung ist veraltet, da sich die Standardeinstellung in der Zukunft ändern wird. Bitte untersuchen Sie diese Einstellung und wählen Sie aus, was für Ihren Anwendungsfall geeignet ist.

Hinweis: Wenn Sie Session in Verbindung mit PassportJS verwenden, fügt Passport der Sitzung ein leeres Passport-Objekt zur Verwendung hinzu, nachdem ein Benutzer authentifiziert wurde. Dies wird als Änderung der Sitzung behandelt und daher gespeichert.