2016-01-08 19 views
13

aradığında, Serialize ve Deserialize denildiğinde, test için alert(user.id) koydum, ancak hiçbir işlem yapılmadı. Serialize ve deserialize çağrıları, pasaport js

  • nasıl bir rol burada örneğin çoklu form değerleri gönderirseniz geri çağırma işlevi, yani function(req, email, password, done), çağırmak nasıl
  • process.nextTick() oynamak user nesne passport.serializeUser(function(user, done){... yılında aldığı itibaren

    • :

      Ben bazı sorularınız (isim, e-posta, şifre, adres, cep). İşte

  • kodudur: -:

    app.post('/login', 
        passport.authenticate('local'), 
         function(req, res) { 
         // If this function gets called, authentication was successful. 
         // `req.user` contains the authenticated user. 
         res.redirect('/users/' + req.user.username); 
    }); 
    

    yansıttığınız Bu kodu bulmak ve onu gibi yukarıda değil görünüyor olmadığını kontrol edin Eğer bir kullanıcının kimliğini doğrulamak zaman

    //config/passport.js 
    
    var LocalStrategy = require('passport-local').Strategy; 
    
    var User   = require('../app/models/user'); 
    
    module.exports = function(passport) { 
    
        passport.serializeUser(function(user, done) { 
         alert(user.id);//// Here is my testing alert 
         done(null, user.id); 
        }); 
    
        passport.deserializeUser(function(id, done) { 
         User.findById(id, function(err, user) { 
          done(err, user); 
         }); 
        }); 
    
    
    passport.use('local-signup', new LocalStrategy({ 
         usernameField : 'email', 
         passwordField : 'password', 
         passReqToCallback : true 
        }, 
        function(req, email, password, done) { 
         process.nextTick(function() { 
         User.findOne({ 'local.email' : email }, function(err, user) { 
    
          if (err) 
           return done(err); 
    
          if (user) { 
           return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
          } else { 
           var newUser   = new User(); 
           newUser.local.email = email; 
           newUser.local.password = newUser.generateHash(password); 
           newUser.save(function(err) { 
            if (err) 
             throw err; 
            return done(null, newUser); 
           }); 
          } 
    
         });  
    
         }); 
    
        })); 
    } 
    

    cevap

    13

    bir proje için Passport.js kullanmanın bilgim dayanarak, ben mümkün olduğunca çok cevap vermeye çalışacağız. Her şeyden

    Birincisi, nodejs içinde alert() gibi bir şey (fonksiyonu) vardır, bu yüzden senin app.js böylece dosya göremiyorum console.log(...)

    gibi bir şey için, bir tarayıcı şeydir senin alert(...) adlandırmak gerekir Devam edip pasaportları kullanma deneyimime dayanarak sorgularınıza cevap vermeye çalışacağım.

    Eğer app.js aşağıdaki olduğunu varsayarsak

    var passport = require('passport'); 
    // express-session configs here 
    // following is invoked on each request. 
    app.use(passport.initialize()); 
    

    passport.initialize() ve passport.session() her istek üzerine çağrılır (sırayla önemlidir, here bakınız) ve req.user kullanıcı kimliğini yüklemek için serializeUser neden olanlardır Sunucuda serileştirilmiş bir kullanıcı bulunursa (kullanıcı mongodb kullanırken, kullanıcı mongodb içinde mevcutsa).

    passport.session() başlangıçta serializeUser tarafından req.user yüklenir ve req.user yılında kullanıcı hakkında daha fazla bilgi depolayan edildi user._id kullanarak MongoDB sorgular her istek üzerine deserializeUser çağırır.

    process.nextTick() olay döngü etrafında bir sonraki geçişte kadar geri arama yürütülmesini ertelemektedir. Veritabanı sorgulama doğası gereği senkronize edilir ve process.nextTick() bunu senkronize hale getirir. Bununla ilgili pek çok ders var, Google. Daha önce belirtildiği gibi

    , app.use(passport.session()) her istek üzerine deserializeUser çalışır (temelde her isteği - hatta statik dosyaları yüklemek istekler için daha sonra passport.session() sonra ekspres statik yol yapılandırmaları listelerseniz).Benim durumumda, belirli yollarda kimlik doğrulamasına ihtiyacım vardı ve yalnızca kullanıcı güvenli bir yola eriştiğinde, deserializeUser vb. Kimlik doğrulamasını yapmak istedim, yalnızca yolun izlediği gibi belirli bir desenle eşleştiğinde passport.session()'u çağırmak için bir koşul koymak zorunda kaldım Yukarıdaki yardımcı ile app.use(passport.session())10'un değiştirilmesi. Artık sadece kullanıcı güvenli yollara eriştiğinde, serializeUser ve deserializeUser dahil pasaport işlemi başlatılır. Yukarıda mükemmel bir çözüm olup olmadığından emin değilim, ancak kullanıcı için (deserializeUser) gereksiz mongodb sorgulama miktarını azaltmaya yardımcı oluyor.

    Son noktanızda ne sorduğunuzdan emin değilsiniz. Yerel ve sosyal auth için pasaportları nasıl uygulayacağınızı gösteren birkaç eğitici var. Etrafınıza bir göz atmalısınız.

    session kullanıcı ile yüklenir nasıl daha ilginç gerçekler için FAZLA OKUMA

    , bu SO question benim cevap okuyun. Express'un ne yaptığını anlatıyor? PassportJS ne yapar? ve iş akışını kolayca anlayacaksınız (belgeler bunu kafa karıştırıcı ve belirsiz hale getiriyor).

    +0

    "passport.initialize() ve passport.session() ..." dediğinizde bir sorum var, eğer seri hale getirilmiş bir kullanıcı bulunursa, serializeUser ** kullanıcı kimliğini req.user 'e yüklemeleri gerekir sunucuda (whe mongodb kullanarak kullanıcı, mongodb içinde varsa). ** "Kullanıcı kimliği nereden geliyor ve" kullanıcı mongodb içinde bulunuyorsa "dediğinizde, otomatik olarak Kullanıcı modeline bakar mı? –

    +0

    Kodunuzun yeniden düzenlenmesi" if (req.url.match ('/ xxx ')) passport.session(); sonraki(); ' – NERDYLIZARD

    0

    Serileştirme olur aşağıdaki gibi:

    passport.authenticate('local', { session: false }) 
    

    Ayrıca lütfen kontrol edin proje kullanım oturumları. Resmi dokümanlarda Sessions'a bakın.

    3

    Sizin 3 nokta hatayı

    function(req, email, password, mobile, address, done) 
    
    , 4 argüman çağrısı olarak alır geri arama fonksiyonu benim anlayış gereğince

    function(req, email, password, done), if send multiple form values e.g(name,email,password,address,mobile). 
    

    aramaya geri function.you gibi kullanamaz ve atmak nasıl

    olduğunu