2015-03-17 22 views
30

Próbuję uruchomić moją lokalną strategię Passport.prośba paszportowa jest zawsze potwierdzająca, nawet jeśli wykonałem polecenie hardcode (null, true)

Mam ten middleware konfigurowaniu:

passport.use(new LocalStrategy(function(username, password, done) { 
    //return done(null, user); 
    if (username=='ben' && password=='benny'){ 
     console.log("Password correct"); 
     return done(null, true); 
    } 
    else 
     return done(null, false, {message: "Incorrect Login"}); 
})); 

ale tu

app.use('/admin', adminIsLoggedIn, admin); 

function adminIsLoggedIn(req, res, next) { 

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) 
     return next(); 

    // if they aren't redirect them to the home page 
    res.redirect('/'); 
} 

to zawsze kończy się niepowodzeniem i przekierowuje do strony głównej.

Nie mogę zrozumieć, dlaczego tak się dzieje? Dlaczego nie uwierzytelni się?

W mojej konsoli widzę, że to Password Correct drukuje. Dlaczego to nie działa?

Odpowiedz

35

Miałem podobny problem. Może to być spowodowane oprogramowaniem pośredniczącym w sesji ekspresowej potrzebnym do paszportu. Naprawiono go za pomocą middleware w następującej kolejności: (Express 4)

var session = require('express-session'); 

// required for passport session 
app.use(session({ 
    secret: 'secrettexthere', 
    saveUninitialized: true, 
    resave: true, 
    // using store session on MongoDB using express-session + connect 
    store: new MongoStore({ 
    url: config.urlMongo, 
    collection: 'sessions' 
    }) 
})); 

// Init passport authentication 
app.use(passport.initialize()); 
// persistent login sessions 
app.use(passport.session()); 
+0

Mam również do czynienia z tym samym problemem ... ale nie jestem w stanie uzyskać rozwiązania – Nodemon

+3

Zrobiłem już to, co powiedziałeś powyżej .. Ale nadal stoję w obliczu problemu – Nodemon

+8

mój problem polegał na tym, że nazwałem "paszport.use, serializeUser, deserializeUser ", ale nie dzwoniłem do" app.use "(passport.initialize()); i "app.use (passport.session());" przed tym – osmingo

2

miałem ten sam problem, zapominając dodać

request.login() 

na

app.post('/login', 
    function(request, response, next) { 
     console.log(request.session) 
     passport.authenticate('login', 
     function(err, user, info) { 
      if(!user){ response.send(info.message);} 
      else{ 

       request.login(user, function(error) { 
        if (error) return next(error); 
        console.log("Request Login supossedly successful."); 
        return response.send('Login successful'); 
       }); 
       //response.send('Login successful'); 
      } 

     })(request, response, next); 
    } 
); 

miejmy nadzieję, że może pomóc w inni, którzy znaleźli się tutaj z tego samego powodu, co ja.

+0

W pliku paszport.authenticaticate użytkownik przyjmuje wartość false, a informacje jako brakujące dane uwierzytelniające. możesz znać błąd. proszę podać moje pytanie do wyjaśnienia http://stackoverflow.com/questions/42898027/passport-js-local-strategy-custom-callback-showing-user-as-false-and-info-as-mi –

+0

@ OE1, Thank ty. Uratowałeś mnie. – Vikram

+2

Uwaga: oprogramowanie pośredniczące passport.authenticate() automatycznie wywołuje funkcję req.login(). Ta funkcja jest używana przede wszystkim wtedy, gdy użytkownicy rejestrują się, podczas których można wywołać metodę req.login(), aby automatycznie zalogować się do nowo zarejestrowanego użytkownika. – Epirocks

6

Może to być również problem z połączeniami POST/GET klienta. Miałem dokładnie ten sam problem, ale okazało się, że muszę dać fetch (czego używałem) opcja credentials:'include' tak:

fetch('/...', { 
    method: 'POST', 
    headers: myHeaders, 
    credentials: 'include', 
    body: ... 
    ...}) 

Powodem jest fakt pobierania nie obsługuje przepuszczanie cookies co jest konieczne w tym przypadku.

5

dla początkujących

miałem do czynienia z podobnym problemem, gdzie funkcja moja isAuthenticated() zwróci false.I stracił dużo czasu, nadzieję, że ta odpowiedź oszczędza twoje.

niektórych typowych problemów na które trzeba uważać,

  1. Middleware zamówienie setup (wyrazić sesja> pass.initialize pass.session>) (a gdy to zrobisz SPRAWDŹ składni).
  2. Serialize i Deserialize metody musi przekazać użytkownika na żądanie. (Aby uzyskać więcej informacji zamieściłem odpowiedź na ten link .. Basics of Passport Session (expressjs)-why do we need to serialize and deserialize?), jeśli nie ma użytkownika na żądanie, to jestAuthenticated zwróci false .... i przekieruj do PATH zdefiniowane ...... kiedy fałszywe .... I ... RAZ PONOWNIE ..... SPRAWDŹ SWÓJ SKŁADNIA.
  3. getUserById lub findById funkcja zdefiniowana w modelu (user.js) musi mieć User.findById (a nie User.findOne sprawdź ponownie .. CZEKAĆ NA IT..SYNTAX) funkcja zdefiniowana. (funkcja ta będzie załadować użytkownikowi na żądanie w każdej sesji)
0

naprawiłem ten problem poprzez ustalenie mój passport.deserializeUser.Używam mongo native, a ponieważ większość przykładów używa Mongoose, znowu wpadłem w pułapkę _id.

Więc pamiętaj, aby _id do Mongo objectID podczas czytania użytkownika w deserializeUser

passport.deserializeUser(function(user, done) { 
    const collection = db.get().collection('users') 
    const userId = new mongo.ObjectID(user); 
    collection.findOne({_id : userId}, function(err, user) { 
     if (err) done(err, null); 
     done(null, user); 
    }); 
}); 

Moje zapytanie nie było znalezienie użytkownikowi, ponieważ nie sprawiają id objectID, i nie było żadnych błędów wskazane wszędzie .