2013-12-04 3 views
1
#set up passport 
LocalStrategy = require('passport-local').Strategy 
passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) -> 

    User.findOne({ email: email }, (err, user) -> 
     console.log("findone") 
     if err? 
     console.log "error" 
     return done(err) 
     if not user 
     console.log("incorrect username") 
     return done(null, false, { message: 'Incorrect username.' }) 
     if password isnt user.password 
      console.log "NOT" 
      return done(null, false, {message: "Incorrect password" }) 
     console.log "BUT YESS" 
     done(null,user) 
    ) 
)) 


passport.serializeUser((user, done) -> 
      done(null, user._id) 
    ) 

    passport.deserializeUser((id, done) -> 
      User.findById(id, (err, user) -> 
      done(err, user) 
     ) 
    ) 

Я использую пример LocalStrategy, как найти на http://passportjs.org/guide/username-password/паспорта с курьерским: проблема сериализации с помощью метода пользовательских аутентификации

Теперь моя проблема заключается в том, что, если я введу неверный пароль или неправильное имя пользователя, я получаю ошибка Error: failed to serialize user into session.

Фактически, в моей функции serializeUser, user есть false. Вероятно, это связано с тем, что код буквально возвращает false в качестве второго параметра выше: return done(null, false, {message: "Incorrect password"})

Но это из документов! Так что я делаю неправильно? Почему у меня проблема с сериализацией, когда параметры неверны? Когда параметры в порядке (имя пользователя и пароль правильные), я могу войти без проблем

EDIT: При комментировании @robertklep вот как я использую функцию аутентификации. В самом деле, потому что мне нужно маршрута в зависимости от себя различным образом роли, я использую паспорт специальный метод (эта деталь добавляется в названии вопроса):

app.post '/login', (req, res, next) -> 
    passport.authenticate('local', (err, user, info) -> 
    return next(err) if err? 
    return res.redirect('/login', { message: req.flash('Access denied')}) if not user? 
    req.logIn user, (err) -> 
     if err? 
     console.log "err! " + err 
     res.redirect("/", { message: req.flash(err)}) 
     return 
     if user.role is "admin" or user.role is "auditor"   
     res.redirect("/dashboard") 
     else 
     res.redirect("/start") 
)(req, res, next) 
+0

Хм, возможно, это зависит от того, как вы называете методы проверки подлинности паспорта, потому что для меня, 'serializeUser' даже не вызывается, когда аутентификация не удается (при пропускании' false' обратного вызова так же, как то, что вы делать). – robertklep

ответ

0
app.post '/login', (req, res, next) -> 
    passport.authenticate('local', (err, user, info) -> 
    console.log "authenticate callback" 
    if err? 
     console.log "err in authenticate callback" 
     return next(err) 
    if not user 
     console.log "User NOT in auth callback" 
     req.flash("Accesso no otorgado", info.message) 
     return res.redirect('/login') 

Я переписал чуток функцию AUTHENTICATE. Вместо if not user? решение должно использовать if not user (без вопросительного знака!), Так как возвращаемый «пользователь» является всего лишь логическим значением false, когда все пошло не так.

1
passport.use(new LocalStrategy(function(username, password, done) { 
    user.findOne({ username: username }, function (err, user) { 

    if (err) { return done(err); } 

//check for incorrect username 
    if (!user) { 
    return done(null, false, { message: 'Incorrect username.' }); 
    } 

    //incorrect password for the selected username 
    if (user.password != password) { 
     return done(null, false, { message: 'Invalid password' }); 
    } 
    return done(null, user); 

}); 
} 
)); 



app.post('/login', function(req, res, next) { 

passport.authenticate('local', function(err, user,info) { 
     if (err) { 
     //console.log(info); 
      return next(err); } 

if (!user) { 
     console.log(info); 
     return res.redirect('/login'); } 

req.logIn(user, function(err) { 
     if (err) { return next(err); 
     } 

      return res.redirect('https://www.google.co.in'); 
    }); 

    })(req, res, next); 

}); 


passport.serializeUser(function(user, done) { 
    done(null, user); 
}); 


passport.deserializeUser(function(login, done) { 
    user.findById(login._id, function(err, user) { 
    done(err, user); 
    }); 
}); 
Смежные вопросы