2016-04-06 4 views
0

In einer Express-Knoten-App, die die Pass-Bibliothek zur Authentifizierung verwendet, konvertiere ich den Sitzungsspeicher von MemoryStore zu connect-couchdb. Die Anmeldeseite ist jetzt flockig und ich denke, dass der neue Sitzungsspeicher langsam genug ist, dass er ein Rennen markiert hat.Sicherstellen, dass der Sitzungsspeicher vor der Login-Weiterleitung fertig ist

Ich benutze die 'successReturnToOrRedirect: /' Option im Pass, und die 'Sitzung bekommen' für/tritt auf, bevor der 'Session Set' in die Datenbank geschrieben hat. Ich habe ein paar extra Logging über die Connect-Couchdb und Passcode verwendet, um dies zu bestätigen.

Gibt es eine Möglichkeit, sicherzustellen, dass req.session.save aufgerufen wird und abgeschlossen wird, bevor res.redirect als Teil des Erfolgs im Pass aufgerufen wird? Der optionale Rückruf, den Sie in authenticate() übergeben können, ersetzt die gesamte integrierte Behandlung, ich habe auf eine Lösung gehofft, wo sie erweitert werden kann.

posted Auch here

Antwort

0

Sir, der Verantwortliche für die Sitzungsverwaltung ist der Express und es über die notwendige Schnittstelle Ihre Session-Speicher wie Memorys Plugin. Und wenn Sie rufen die req.session.save Sie einen Rückruf verdienen auch :-)

req.session.save(function(err) { 
    if (err) { 
    // Houston we have a problem 
    return err; 
    } 

    // Session saved 
}) 
+0

Das Problem hierbei ist, dass passport.js mit dem niedrigen Niveau Detail Umgang Authentifizierung der Überprüfung, und es gibt keine Möglichkeit, manuell req.session.save aufrufen, bevor es Umleitungen (auf Erfolg). Sie können mit einem Rückruf konfigurieren, aber dies ersetzt den gesamten Handler. –

+0

Sehen Sie sich zum Beispiel strategie.success unter https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js an –

0

Eine mögliche Abhilfe ist, eine Sitzung speichern zu zwingen, bevor alle Umleitungen, die in meinem Fall arbeiten passiert. Die einzige res.redirect, die wir haben, ist Teil des Passes. Etwas wie:

module.exports = function(req, res, next) { 
    const _redirect = res.redirect; 
    res.redirect = function(args) { 
     if (req.session) { 
      req.session.save(err => { 
       if (err) { 
        // handle error 
       } 
       _redirect.call(res, args); 
      }) 
     } else { 
      _redirect.call(res, args); 
     } 
    } 
}