2014-06-11 9 views
7

Moja konfiguracja passport.js idzie tak:Passport.js nie przechodzi użytkownikowi wystąpić w req.login()

const Local = require("passport-local").Strategy; 
const USMODEL = require("../models/user.js"); 
passport.serializeUser(function(user, done) { 
    console.log("SERIALIZING USER"); 
    done(null, user.id); 
}); 
passport.deserializeUser(function(id, done) { 
    console.log("DESUSER", id); 
    var US = mongoose.model("RegUser", USMODEL); 
    US.findById(id, function(err, user) { 
     done(err, id); 
    }); 
}); 
passport.use("local-login", new Local({ 
    usernameField: "email", 
    passwordField: "password", 
    passReqToCallback: true 

},function(req, email, password, done) { 
    var US = mongoose.model("RegUser", USMODEL); 
    US.findOne({"email": email}, function(err, user){ 
     if(err) throw err; 
     if(!user) return done(null, false); 
     if(!user.validPassword(password)) { 
      console.log("password not valid"); 
      return done(null, false); 
     } 
     return done(null, user); 
    }); 
})); 

mam zmiany modelu Mongoose w każdej z funkcji, bo pogodzić z wieloma zbiorami na raz i lubię mieć pełną kontrolę nad tym, co się dzieje.

Mój plik router.js ma następujące ścieżki, które wykorzystują middleware paszportu:

app.get("/user/login", function(req, res) { 
    res.render("signin"); 
}); 
app.post('/user/login', function (req, res){ 
    passport.authenticate('local-login', function(err, user, info){ 
     if (err) return res.redirect("/"); 
     if (!user) return res.redirect('/'); 

     else { 
      req.login(user, function(err) { 
       if (err) return next(err); 
       console.log("Request Login supossedly successful."); 
       return res.redirect('/admin/filter'); 
      }); 
     } 
    })(req, res); 
}); 

, który po pomyślnym uwierzytelnieniu przekierowuje do/admin/filtr w tym samym routerze, że idzie tak tak.

app.get("/admin/filter", isLoggedIn, function(req, res){ 
//rendering stuff here 
}); 

Teraz wniosek admin/filtr mija middleware nazwie isLoggedIn który teoretycznie chroni moje punkty końcowe. To idzie tak:

function isLoggedIn(req, res, next) { 
console.log("This is the authentication middleware, is req authenticated?"); 
console.log(req.isAuthenticated()); 
console.log("Does req.user exist?") 
console.log(req.user); 
return next(); 
} 

Teraz można się spodziewać, że z powodu zadzwoniłem req.login i mam przekierowany do mojego końcowego wyboru, wniosek zostanie uwierzytelniony. Nie o to chodzi.

Request Login supossedly successful. 
This is the authentication middleware, is req authenticated? 
false 
Does req.user exist? 
undefined 

Nie mogę znaleźć źródła mojego problemu. Wszystko sprawdza się, gdy wywoływana jest strategia, a także funkcja wywołania zwrotnego i req.login, która w teorii renderowałaby obiekt o wartości req.user. Jedną z dziwnych rzeczy, które zaobserwowałem, jest to, że nie widzę w działaniu metody passport.deserializeUser(). Zawsze. Ale to może być styczne z problemem. Paszport zdecydowanie używa mojej strategii i renderuje obiekt użytkownika, ale jakoś ten sam obiekt nie wchodzi w zakres żądania. Czy masz jakieś sugestie lub pomysł na temat tego, co się dzieje?

+0

Czy potrzebujesz również "wymagać (" paszportu ")? lub jest "paszportowo-lokalny", zajmując się tym - zainstalowałem paszport od zera i miałem podobne problemy w jednym punkcie - próbując sobie przypomnieć, na czym polegał problem. – ewizard

+0

spróbuj wstawić 'req.login (użytkownik ...' w pliku passport.js w funkcji zwrotnej na końcu – ewizard

+0

tak @ewizard paszport-local wymaga użycia paszportu, ponieważ obejmuje on tylko strategię –

Odpowiedz

4

Rozwiązałem ten problem, żonglując przy pomocy samouczka, od którego zacząłem, gdy po raz pierwszy nauczyłem się korzystać z oprogramowania pośredniego Passport. Okazuje się, że robię źle Konfiguracja: Mój kod kiedyś jak to w pliku serwera:

pass = require("passport"); 
app.use(pass.initialize()); 
app.use(pass.session()); 
require("./app/config/passport.js")(pass); 

kiedy to powinno być tak:

pass = require("passport"); 
require("./app/config/passport.js")(pass); 
app.use(pass.initialize()); 
app.use(pass.session()); 

Albo brakowało mi udział w dokumentacji gdzie jest określone, że konfiguracja musi nadejść przed inicjalizacją lub jest po prostu zapisana jako rzecz trywialna do zauważenia. Tak czy inaczej, rozwiązałem mój problem.

+0

Nie, twoje poprzednie zamówienie jest poprawne lub zamówienie nie ma znaczenia. Zobacz przykład tutaj: https://github.com/tutsplus/passport-social/blob/master/app.js#L41 – derek

Powiązane problemy