2016-06-24 38 views
1

Ich bin ein Knoten-Anwendung, in denen die Benutzer registrieren oder anmelden müssen, dann, wenn sie einige Elemente ziehen und ablegen (das Frontend funktioniert alles) Ich auf der Datenbank ihre Aktion mit ihren entsprechenden speichern Benutzeridentifikation.Express Passport-Sitzung funktioniert nicht

Mein Verständnis ist, dass sobald sie registriert/angemeldet sind, kann ich die req.user verwenden, um ihre ID zugreifen und ihre Aktionen korrekt speichern, aber es funktioniert nicht.

Hier ist der Abschnitt meiner server.js-Datei, die Passport behandelt. Außerdem verwende ich Sequelize als ORM, aber alles, was mit der Datenbank zu tun hat, funktioniert ohne den req.user Teil perfekt.

app.use(cookieParser()); 
app.use(bodyParser.json()); 

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

/****** Passport functions ******/ 
passport.serializeUser(function (user, done) { 
    console.log('serialized'); 
    done(null, user.idUser); 
}); 

passport.deserializeUser(function (id, done) { 
    console.log("start of deserialize"); 
    db.user.findOne({ where : { idUser : id } }).success(function (user) { 
     console.log("deserialize"); 
     console.log(user); 
     done(null, user); 
    }).error(function (err) { 
     done(err, null); 
    }); 
}); 

//Facebook 
passport.use(new FacebookStrategy({ 
    //Information stored on config/auth.js 
    clientID: configAuth.facebookAuth.clientID, 
    clientSecret: configAuth.facebookAuth.clientSecret, 
    callbackURL: configAuth.facebookAuth.callbackURL, 
    profileFields: ['id', 'emails', 'displayName', 'name', 'gender'] 

}, function (accessToken, refreshToken, profile, done) { 
    //Using next tick to take advantage of async properties 
    process.nextTick(function() { 
     db.user.findOne({ where : { idUser : profile.id } }).then(function (user, err) { 
      if(err) { 
       return done(err); 
      } 
      if(user) { 
       return done(null, user); 
      } else { 
       //Create the user 
       db.user.create({ 
        idUser : profile.id, 
        token : accessToken, 
        nameUser : profile.displayName, 
        email : profile.emails[0].value, 
        sex : profile.gender 
       }); 

       //Find the user (therefore checking if it was indeed created) and return it 
       db.user.findOne({ where : { idUser : profile.id } }).then(function (user, err) { 
        if(user) { 
         return done(null, user); 
        } else { 
         return done(err); 
        } 
       }); 
      } 
     }); 
    }); 
})); 

/* FACEBOOK STRATEGY */ 
// Redirect the user to Facebook for authentication. When complete, 
// Facebook will redirect the user back to the application at 
//  /auth/facebook/callback// 
app.get('/auth/facebook', passport.authenticate('facebook', { scope : ['email']})); 
/* FACEBOOK STRATEGY */ 
// Facebook will redirect the user to this URL after approval. Finish the 
// authentication process by attempting to obtain an access token. If 
// access was granted, the user will be logged in. Otherwise, 
// authentication has failed. 

    app.get('/auth/facebook/callback', 
     passport.authenticate('facebook', { failureRedirect: '/' }), 
     function (req, res) { 
      // Successful authentication, redirect home. 
      res.redirect('../../app.html'); 
     }); 


app.get('/', function (req, res) { 
    res.redirect('/'); 
}); 

app.get('/app', isLoggedIn, function (req, res) { 
    res.redirect('app.html'); 
}); 

app.post('/meal', function (req, res) { 
    //Testing Logs 
     /*console.log(req.body.foodId); 
     console.log(req.body.quantity); 
     console.log(req.body.period); 
     console.log(req.body); 
     */ 

    //Check whether or not this is the first food a user drops on the diet 
    var dietId = -1; 

    db.diet.findOne({ where : { userIdUser : req.user.idUser } }).then(function (diet, err) { 
     if(err) { 
      return done(err); 
     } 
     if(diet) { 
      dietId = diet.idDiet; 
     } else { 
      db.diet.create({ userIdUser : req.user.idUser }).then(function (diet) { 
       dietId = diet.idDiet; 
      }); 
     } 
    }); 

    db.meal.create({ 
     foodId : req.body.foodId, 
     quantity : req.body.quantity, 
     period : req.body.period 
    }).then(function (meal) { 
     console.log(meal.mealId); 
     res.json({ mealId : meal.mealId}); 
    }); 
}); 

Von dem, was ich auf der Dokumentation für Passport lesen, die deserializeUser Funktion, die ich soll aufgerufen werden, implementiert, wenn ich req.user verwenden, aber mit meinem console.logs(), fand ich heraus, dass serializeUser genannt wird Nach dem Einloggen speichert es meine Sitzung, aber deserializeUser wird nie aufgerufen! Je.

Irgendeine Idee, wie man das umgehen kann? Jede Hilfe wird geschätzt, danke!

Antwort

3

Sie benötigen die express session middleware vor dem Aufruf passport.session(). Lesen Sie die passportjs configuration section Dokumentation für weitere Informationen.

+0

Vielen Dank! Ich habe nur eine Follow-up-Frage, was ist der "Laden" und warum sollte ich ihn verwenden müssen? Ich meine, warum sollte ich ein anderes Modul brauchen, um diese Informationen zu speichern? Sind Cookies nicht genug? – leofontes

+1

Ein Sitzungsspeicher ist eine Möglichkeit zum Speichern der Sitzungsinformationen außerhalb des Nodejs-Prozesses, auf dem Ihre Express-App ausgeführt wird. Standardmäßig verwendet die Sitzungs-Middleware einen speicherinternen Speicher, der nur für Entwicklungszwecke geeignet ist. Sobald Sie in die Produktionsphase eintreten (Prozesse mit mehreren Knoten hinter dem Lastenausgleich), funktioniert der Standardsitzungsspeicher nicht mehr für Sie. Sie können Cookies verwenden, um die Sitzungsinformationen zu speichern, aber denken Sie immer daran, dass die Cookie-Größe sehr begrenzt ist und Sie möglicherweise einige sinnvolle Informationen haben, die Sie nicht über das Netzwerkereignis verschlüsselt übertragen möchten. – yeiniel

Verwandte Themen