2016-05-17 7 views
1

Ich habe ein Problem beim Laden von Sitzungen mit passJS. Irgendwie ist bei jeder Anfrage eine neue Sitzung anzutreffen. Die SerializeUser-Funktion kann die vorhandene Sitzung nicht finden und erstellt jedes Mal eine neue Sitzung. Wie kann ich das wissen?
1. Die mysessions Tabelle in Mongodb. Für jede Anfrage werden zwei Einträge in der Tabelle angelegt. Welche sehen in etwa so aus.PassportJS: Sitzungen funktionieren nicht wie erwartet

{ 
    "_id" : "U_MhBL17rMVdFbuXt7Y5RGjZeHR5mP7O", 
    "session" : { 
     "cookie" : { 
      "originalMaxAge" : 2419200000, 
      "expires" : ISODate("2016-06-14T14:32:30.721Z"), 
      "secure" : null, 
      "httpOnly" : true, 
      "domain" : null, 
      "path" : "/" 
     }, 
     "passport" : { 

     } 
    }, 
    "expires" : ISODate("2016-06-14T14:32:30.721Z") 
} 
{ 
    "_id" : "fSfITl6hGLdvny1PVZ3iJ6_dFzTmNJj3", 
    "session" : { 
     "cookie" : { 
      "originalMaxAge" : 2419200000, 
      "expires" : ISODate("2016-06-14T14:32:30.808Z"), 
      "secure" : null, 
      "httpOnly" : true, 
      "domain" : null, 
      "path" : "/" 
     }, 
     "passport" : { 
      "user" : "573b11e32147fec27aa9534e" 
     } 
    }, 
    "expires" : ISODate("2016-06-14T14:32:30.808Z") 
} 
  1. Deserialize Benutzer nie aufgerufen.
    Aber ich verstehe nicht, warum es nicht heißt. Ich habe gesehen und this, aber ich denke, ich habe alles aussortiert.

Hier ist meine environment.js

var MongoDBStore = require('connect-mongodb-session')(session); 

    var sessionStore = new MongoDBStore({ 
     uri: "mongodb://localhost:27017/metaiotAdmin", // Development mode 
     collection: 'mysessions' 
    }); 
    sessionStore.on('error', function(error) { 
     assert.ifError(error); 
     assert.ok(false); 
    }); 
    /*session options to be given to express. It's really express keeping the sessions and not passport*/ 
    var sessionOpts = { 
     saveUninitialized: true, 
     resave: false, 
     store: sessionStore, 
     secret: "cat at my keyboard", 
     cookie: { 
      httpOnly: true, 
      maxAge: 2419200000 
     } 
    }; 
    /*declaring all my global variables and dependencies*/ 

    app.use(cookieParser("cat at my keyboard")); // Secret should be kept in a config file and the folder should be added in gitignore 
    app.use(bodyParser.json()); 
    app.use(bodyParser.urlencoded({ 
     extended: true 
    })); 
    app.use(bodyParser.text({ 
     type: "text/plain" 
    })); 
    app.use(session(sessionOpts)); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

Mein login.js

passport.serializeUser(function(user, done) { 
     console.log("Serialize", user.id); 
     done(null, user.id); 
    }); 

    passport.deserializeUser(function(_id, done) { 
     console.log("deserializeUser"); 
     Users.findById(_id, function(err, user) { 
      console.log(err); 
      done(err, user); 
     }); 
    }); 

    passport.use('local-login', new LocalStrategy({ 
     passReqToCallback: true 
    }, function(req, username, password, done) { 
     Users.findOne({ 
      'emailId': username 
     }, function(err, user) { 
      if (err) 
       return done(err); 
      if (!user) { 
       return done(null, false, { 
        message: 'Username does not exist' 
       }); 
      } else if (password === user.password) { 
       console.log("User is verified"); 
       req.session.save(); 
       return done(null, user); 

      } else 
       return done(null, false, { 
        message: "Password does not match" 
       }); 
     }); 
    })); 

    app.post('/auth/login', passport.authenticate('local-login'), function(req, res, next) { 
     res.sendStatus(200); 
    }); 

Datei kann ich nichts schrecklich falsch sehen. Hilfe wird geschätzt.

Antwort

0

Nun, um zu überprüfen, ob Sie wirklich ein Problem mit Ihrem Backend haben. Versuchen Sie, eine Anfrage von Postman zu senden. Wenn es immer noch so ist, bedeutet das, dass es sich um ein Backend-Problem handelt und wahrscheinlich wird Ihre Konfiguration irgendwo durcheinander gebracht. Wenn es das nicht ist. Es bedeutet, dass Postman eine ordnungsgemäße Anfrage senden kann, aber Sie können nicht. Es bedeutet, dass das Problem in Ihrem Frontend liegt.

Also habe ich doppelt überprüft und festgestellt, dass ich zwei Zeilen aus meinem eckigen Code dumm gelöscht.

$httpProvider.defaults.withCredentials = true; 
$httpProvider.defaults.useXDomain = true; 

Diese Zeilen sind wichtig, da sie den Header festlegen, der wiederum den Deserializer ausführt. Diese beiden Zeilen werden automatisch für Postman hinzugefügt, aber nicht für mich. Das habe ich gemerkt, nachdem ich die Anfrage und die Antwort von Postman und Browser gesehen hatte.

Wenn Sie weitere Zweifel haben, lassen Sie es mich wissen