2013-12-17 21 views
13

En basit olanı olabileceğimi düşündüğüm şeyi ayarlıyorum - bir site ekranda oturum açıyor, kullanıcı formda kimlik bilgilerini giriyor, gönderim sırasında Passport kullanıyorum. Kimlik bilgilerini kontrol etmek için JS ve Sequelize. Bunların çoğu, çeşitli öğreticilerden veya Passport web sitesinin kendisinden kopyalanır. Ne yaptığımın, değiştirdiğimin veya denediğimin bir önemi yok, ancak site formu gönder düğmesini tıklatır tıklamaz. Dev araçlar ağı sekmesinde, gönderim isteğini beklemede/oturum açma olarak gösteriyorum.Daha Fazla Passport.js sıkıntısı - form gönderiminde kilitleniyor

Mümkün olan tüm sorunları gidermek için, Sequelize'i sıyırma işlemini tamamladıktan sonra, sabit kodlanmış kullanıcıları kullandım, yerel kullanım örneğini passport github page'dan alacağım. Yine de, hiçbir değişiklik, Sequelize için sorun değildi.

Eminim aptalca bir şey. Açık çözümlerimi denedim, formumun 'kullanıcı adı' ve 'şifre' gönderdiğinden emin olmak gibi.

Benim formu şuna benzer: get istek üzerine ok

var login = require('../app/controllers/login'); 
app.get('/', login.index); 
app.post('/login', login.auth); 

sayfa yükleme:

düğüm Benim app.js ise
form(method="post", action="/login") 
    fieldset 
    legend Please Log In 
    label(for="username") Username: 
    input#username(type='text', name="username", autocomplete="off") 
    label(for="password") Password: 
    input#password(type='password', name="password") 
    button#login(type="submit") Log In 

bu içeren bir yönlendirici kullanır.

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    }); 
}; 

console.log (req.body) formu değerleri gösteren, yukarı ince gelir, bu yüzden bu noktaya Tamam: yayında bu yönlendirir. Ama sonra hiçbir şey yok. Bu son parçasıdır:,

passport.use(new LocalStrategy(
    function(username, password, done) { 
    console.log('local strat invoked'); 
    findByUsername(username, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
     if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } 
     return done(null, user); 
    }); 
    } 
)); 

Bu findByUsername fonksiyonu ile kullanıcı için DB kontrol etmek Sequelize kullanılan (kopyalanıp pasaport github sayfasından yukarıda belirtilen görevinden düz yapıştırılan) kodu takas ama console.log ('local strat invoke') asla gelmiyor, bu noktada sonra bile hiçbir şey tahmin etmem.

Ayrıca passport.serializeUser ve passport.deserializeUser içerir, ancak bunlar benim sıkışmış olduğum aşamada sorun olduğunu düşünemiyorum.

Bu çalışma için hangi adımı kaçırdığım hakkında bir fikrim var mı?

cevap

27

Pasaport Bir rota işleyici işlevine gömmek ise, bunu çağırmak gerekir, ara katman ise:

exports.auth = function (req, res, next) { 
    console.log(req.body); 
    passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
    })(req, res, next); // <-- NEED TO INVOKE WITH req, res, next 
}; 

veya daha basit önerilen yaklaşım olan (katman olarak kullanmak:

exports.auth = passport.authenticate('local', { 
    successRedirect: '/home', 
    failureRedirect: '/', 
    failureFlash: true 
}); 
+0

Çağıran sorun oldu. Teşekkürler, hiçbir zaman oldukça işe yaramadı middleware yöntemi, bu yüzden bunu tekrar gerekir. – DrHall

İlgili konular