2013-10-24 12 views
6

पिछले कुछ दिनों से मैं पासपोर्ट.जेएस का उपयोग कर अपना पहला उपयोगकर्ता लॉगिन & प्रमाणीकरण प्रणाली विकसित कर रहा हूं। अजीब रूप से पर्याप्त, मैंने इसे समाप्त कर लिया है और यह इरादे के अनुसार काम करता है। समस्या यह है कि, हालांकि मैंने बहुत सारे लेख पढ़े हैं और ऑनलाइन उदाहरणों की जांच की है, मुझे लगता है कि प्रति कोड पूरी तरह से समझ में नहीं आता है। मुझे इसके पीछे की प्रक्रिया को समझने में कोई समस्या नहीं है और ऐसा क्यों होना है। यदि आप मेरे लिए कोड के कुछ हिस्सों को स्पष्ट कर सकते हैं तो मैं वास्तव में इसकी सराहना करता हूं। (- नेवला मॉडल उपयोगकर्ता)पासपोर्ट.जेएस उपयोगकर्ता लॉगिन और प्रमाणीकरण

// Passport session setup 
passport.serializeUser(function (user, done) { 
    done(null, user._id); 
}); 

passport.deserializeUser(function (id, done) { 
    User.findById(id, function(err, user) { 
     done(err, user); 
    }); 
}); 

// Use the Local Strategy within passport 
passport.use(new LocalStrategy(function (username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { 
      return done(err); 
     } 

     if (!user) { 
      return done(null, false, { message: 'Unknown user: ' + username}); 
     } 

     user.comparePassword(password, function(err, isMatch) { 
      if (err) { 
       return done(err); 
      } 

      if (isMatch) { 
       return done(null, user); 
      } else { 
       return done(null, false, { message: 'Invalid Password' }); 
      } 
     }); 
    }); 
})); 

var app = module.exports = express(); 

app.configure(function() { 
    app.set('views', path.join(__dirname + '/views')); 
    app.set('view engine', 'html'); 
    app.engine('html', hbs.__express); 
    app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ secret: 'xxx' }));  
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname + '/public'))); 

}); 

मैं MongoDB उपयोग कर रहा हूँ: यह काम कर कोड, मेरे app.js फ़ाइल में संग्रहीत है। साथ ही, डेटाबेस में पासवर्ड स्टोर करने के लिए मैं वर्तमान में bcrypt का उपयोग कर रहा हूं।

मुझे लगता है कि सबसे महत्वपूर्ण हिस्सा जो मुझे समझ में नहीं आता है कॉलबैक फ़ंक्शन किया गया है। मैं समझ सकता हूं कि यह केवल कुछ मानों को पास करता है, और मुझे पता है कि इसका पहला पैरामीटर त्रुटि है और दूसरा डेटा है। फिर भी, मैं इसे पूरी तरह से समझ नहीं पा रहा हूं क्योंकि मैंने विशेष रूप से एक पैरामीटर के रूप में प्रदान नहीं किया है।

// Random Function 
var randomFunction = function (a, b, done) { 
    done(a, b); 
}; 

// Then I would call the randomFunction providing my own **done** 
randomFunction('Random', 'Words', function(a, b) { return a + b; }); 

फिर भी, मेरे उदाहरण में मैं किया कॉलबैक को निर्दिष्ट एक नहीं कर रहा हूँ: उदाहरण के लिए, मैं इस तरह एक समारोह होता है। यह बस एक आवश्यक कॉलबैक फ़ंक्शन पैरामीटर है या यह इस तरह के रूप में एक सामान्य मिडलवेयर में अगले समारोह के रूप में एक ही है:

function middleware (req, res, next) { 
    next(req.user); // pass the req.user to next middleware 
} 

इसके अलावा, जहां Passport.js उपयोगकर्ता है कि यह संभालती बाध्य करता है? क्या यह req.user पर बांधता है? और मैं इसे कुछ दृश्यों में कैसे पास कर सकता हूं, उदाहरण के लिए, उपयोगकर्ता नाम प्रदर्शित करने के लिए?

मैं आपकी प्रतिक्रिया के लिए तत्पर हूं!

धन्यवाद!

उत्तर

3

हो गया कॉलबैक

Local Strategy के कोड पर देखो:

function Strategy(options, verify) { 
    ... 
    this._verify = verify; 
    ... 
} 

verify समारोह है कि रणनीति द्वारा उपयोग किया जाएगा एक उपयोगकर्ता सत्यापित करने के लिए है और आप इसे यहाँ निर्दिष्ट किया है:

passport.use(new LocalStrategy(function (username, password, done) { 
    // your verification code here 
})); 

बाद में रणनीति में आप authenticate विधि ढूंढ सकते हैं जो सत्यापन कार्य को कॉल करता है

this._verify(username, password, verified); 

तो, अब आप देख जहां username, password और done==verified से आते हैं: ऊपर चरण से। बाद में आपके कोड में आप done कॉलबैक (त्रुटि, उपयोगकर्ता, जानकारी) तर्कों के साथ कॉल करेंगे। कुछ शब्दों में, उपयोगकर्ता सत्यापन की एसिंक्रोनस प्रक्रिया को समाप्त करने के लिए done की आवश्यकता है।

req.user और विचारों

हाँ, आप सही req.user के बारे में कर रहे हैं।res.render समारोह का एक तर्क के रूप में

  1. : तो आप दो तरीके से अपने विचार करने के लिए इसे पारित कर सकते हैं। See docs

    res.render('some-template', { name: req.user }); 
    
  2. उपयोग res.locals संदर्भ प्रदाता के कुछ प्रकार के रूप में (अब उपयोगकर्ता वस्तु सभी दृश्यों कि app.router में परिभाषित कर रहे हैं में उपलब्ध हो जाएगा)। See docs

    // before app.use(app.router); 
    app.use(function(req, res, next) { 
        res.locals.user = req.user; 
        next(); 
    }); 
    
+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद! जैसा कि मैंने इसे समझ लिया है, किया गया एक कॉलबैक फ़ंक्शन है जो मिडलवेयर से जानकारी वापस करने के लिए उपयोग किया जाता है। जानकारी से मेरा मतलब है 3 पैरामीटर (त्रुटि, उपयोगकर्ता, जानकारी)। असल में, क्या मैं किए गए कॉलबैक को (उच्च स्तरीय तरीके से) उस विशिष्ट मिडलवेयर की वापसी के रूप में मान सकता हूं? –

+1

यदि मैं आपके प्रश्न को सही तरीके से समझ गया, नहीं। 'किया' का उपयोग केवल अगले स्तर पर कुछ डेटा प्रदान करने के लिए किया जाता है। 'सत्यापन() 'को कॉल करने के बाद आपका सत्यापन कोड सामान्य तरीके से निष्पादित किया जाएगा, यही कारण है कि आपको सत्यापन कोड निष्पादित करना बंद करने के लिए' वापसी (गलती); 'का उपयोग करना चाहिए। एसिंक सामान के लिए यह आम मामला है। –

+0

मेरा यही मतलब था ^^ मुझे लगता है कि मैं अपने जवाब में थोड़ा अस्पष्ट था :) धन्यवाद आपकी प्रतिक्रिया के लिए, मैं वास्तव में इसकी सराहना करता हूं! –

संबंधित मुद्दे