2016-07-17 21 views
0

Ich benutze Pass mit Pass-local für mongoDB Login.node-express-pass (LocalStrategy)

passport.use('local-login', new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password', 
    passReqToCallback : true 
    }, 
    function(username, password, done) { 
    User.findOne({ username: username }, function (err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false); } 
     if (!user.verifyPassword(password)) { return done(null, false); } 
       console.log(user); 
       console.log(req.session); 
       console.log(req.session.passport); 
       return done(null, user); 
    }); 
    } 
)); 

Und der POST Aufruf

router.post('/login', passport.authenticate('local-login'), function(req, res) { 
    res.json(req.user); 
}); 

wenn ich POST Anruf von Winkel Sitzung vornehmen, werden nicht gespeichert zu werden. Hier ist mein console.log vom Server nach Winkel POST-Anfrage:

-------user--------- 
    { _id: 5782f005917d7fa01b27adba, 
     username: 'asd', 
     password: 'asd', 
     __v: 0, 
     roles: [ 'user' ] } 
    -------req.session--------- 
    Session { 
     cookie: 
     { path: '/', 
     _expires: null, 
     originalMaxAge: null, 
     httpOnly: true, 
     secure: false } } 
    -------req.session.passport--------- 
    undefined 
    ---------------- 
    serializeUser: 5782f005917d7fa01b27adba 

Getestet habe ich es mit Postbote auch, und es scheint zu funktionieren. Der Benutzer nach dem Login apear in der Sitzung:

 -------req.session--------- 
    Session { 
      cookie: 
      { path: '/', 
      _expires: null, 
      originalMaxAge: null, 
      httpOnly: true, 
      secure: false }, 
      passport: { user: '5782f005917d7fa01b27adba' } } 
    -------req.session.passport--------- 
    { user: '5782f005917d7fa01b27adba' } 

Meine Konfiguration ist:

app.use(bodyParser.urlencoded({ extended: true })); 
    app.use(bodyParser.json()); 
    app.use(session({ 
     secret: 'brucespringsteinmegaboss', 
     resave: true, 
     saveUninitialized: true, 
     cookie: { 
      secure: false 
     } })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

Paket:

"body-parser": "^1.15.2", 
"express": "^4.14.0", 
"express-session": "^1.14.0", 
"mongoose": "^4.5.3", 
"passport": "^0.3.2", 
"passport-local": "^1.0.0" 

npm: 3.9.6 Knoten: 6.2.2

Winkelanruf:

$scope.login = function(form, user) { 
    if (form.$valid) { 
     $http.post('http://localhost:3000/api/auth/local/login', user) 
     .success(function(resp){ 
     $rootScope.currentUser = user; 
     console.log($rootScope.currentUser); 
     }); 
    } 
    }; 

Ich würde es schätzen, wenn jemand dieses Problem erklärt.

+0

Ich bezweifle, dass 'req.session.passport' für eine neue Sitzung am Standort zur Verfügung stehen wird, dass Sie es sind zu protokollieren. Ich denke, der Grund, warum es für den Postman-Anruf angezeigt wird, liegt darin, dass es für einen _previous_ Anruf festgelegt wurde. Meine Vermutung ist, dass Sie versuchen, ein anderes Problem zu debuggen, nämlich, dass die Sitzung anscheinend nicht existiert, wenn Sie Angular $ http-Aufrufe machen, nachdem Sie eingeloggt sind. – robertklep

+0

Wenn ich eine Antwort wie isAuth in Route zuweise, kann ich Postman erhalten zum Beispiel wahr oder falsch, wenn der Benutzer authentifiziert ist oder nicht (wenn der Benutzer in der Sitzung existiert oder nicht). Wenn ich eckig benutze, gibt dies jede einzelne Anfrage zurück, weil die Sitzung nicht gespeichert ist. Wenn ich einen anderen Benutzer benutze ist das selbe Sache eckig funktioniert nicht und Postbote funktioniert. – Kerrop

+0

Dieses Problem wird höchstwahrscheinlich verursacht, weil Ihre Cookies "httpOnly" sind, was bedeutet, dass Cookies nicht gesendet werden (standardmäßig), wenn Sie AJAX-Anrufe tätigen. Lesen Sie die Dokumentation zu ['$ http'] (https://docs.angularjs.org/api/ng/service/$http), insbesondere die Option' withCredentials'. – robertklep

Antwort

0

ich es mit withCredentials: true, auf Winkelseite lösen und app.use(function(req, res, next) { res.header('Access-Control-Allow-Origin', 'http://localhost:9000'); res.header('Access-Control-Allow-Credentials', true); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header("Access-Control-Allow-Headers", "Origin, Authorization, X-Requested-With, Content-Type, Accept"); }); auf app.js

Verwandte Themen