2012-09-21 20 views
22

मैं नोडजेज पर पासपोर्ट सेट करता हूं और उपयोगकर्ताओं को लॉगिन करने और नए खाते बनाने की अनुमति देने के लिए यह मोंगोस के साथ काम कर रहा हूं।नोडजेएस पासपोर्ट

app.js:

var express = require('express') 
    , app = module.exports = express.createServer() 
    , passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy 
    , routes = require('./routes/index')(app) //index loads in multiple routes 
    , MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection; 

// Configuration 
app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ secret: 'justdoit' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

var mongoDbConnection = new MongoDBConnection(); 

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

passport.deserializeUser(function(id, done) { 
    mongoDbConnection.findUserById(id, function(err, user){ 
     done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
     process.nextTick(function() { 
      mongoDbConnection.findUser(username, function(err, user) { 
       //conditions.... 
      }); 
     }); 
    } 
)); 

app.get('/', function(req, res){ 
    res.render('index', { title: "Index", user: req.user }); 
}); 

app.get('/account', ensureAuthenticated, function(req, res){ 
    res.render('account', { title: "Account", user: req.user }); 
}); 

app.get('/login', function(req, res){ 
    res.render('login', { title: "Login", user: req.user, message: req.flash('error') }); 
}); 

app.post('/login', 
    passport.authenticate('local', { 
     successRedirect: '/account', 
     failureRedirect: '/login', 
     failureFlash: true }) 
); 

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login') 
} 

मेरे समस्या app.js है (जो है, जहां पासपोर्ट कोड है) फ़ाइल थोड़ा बड़ा हो रहा है और मैं अपनी ही लिपि में पासपोर्ट वर्गों को स्थानांतरित करने की कोशिश की और app.js के बाहर के मार्ग हैं और अपने स्वयं के auth.js रूट फ़ाइल में और फिर app.js. के माध्यम से मार्गों का संदर्भ लें। यह अन्य मार्गों के लिए काम करता है लेकिन पासपोर्ट से संबंधित लोगों जैसे कि लॉगिन के रूप में यह passport.authenicate() फ़ंक्शन को आग लगाना प्रतीत नहीं होता है।

क्या वैसे भी मैं पासपोर्ट मार्ग और कार्यों को अपनी फ़ाइल में डाल सकता हूं और इसे app.js से लोड/लोड कर सकता हूं?

auth.js:

module.exports = function(app){ 

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

passport.deserializeUser(function(id, done) { 
    mongoDbConnection.findUserById(id, function(err, user){ 
     done(err, user); 
    }); 

}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
     process.nextTick(function() { 

      mongoDbConnection.findUser(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); 
      }); 
     }); 
    } 
)); 

app.get('/', function(req, res){ 
    res.render('index', { title: "Index", user: req.user }); 
}); 

app.get('/account', ensureAuthenticated, function(req, res){ 
    console.log("directing to the account page...."); 
    res.render('account', { title: "Account", user: req.user }); 
}); 

app.get('/login', function(req, res){ 
    res.render('login', { title: "Login", user: req.user, message: req.flash('error') }); 
}); 

app.post('/login', 
    passport.authenticate('local', { 
     successRedirect: '/account', 
     failureRedirect: '/login', 
     failureFlash: true }) 
); 

function ensureAuthenticated(req, res, next) { 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login') 
} 
} 
+0

क्या आप कुछ कोड पोस्ट कर सकते हैं? – UpTheCreek

+0

वहां कुछ कोड जोड़ा गया। असल में मैं इसे बाहरी रूट फ़ाइल में स्थानांतरित करने और app.js. से अव्यवस्था को हटाने के लिए देख रहा हूं। – DanyZift

+0

क्या आप app.js v2 भी पोस्ट कर सकते हैं? शायद समस्या यह है कि मॉड्यूल app.js. में आपके द्वारा बनाए गए पासपोर्ट ऑब्जेक्ट को नहीं देख सकता है। आप ऐप पास कर रहे हैं, लेकिन पासपोर्ट नहीं। आज़माएं: 'module.exports = function (ऐप, पासपोर्ट) {...' – UpTheCreek

उत्तर

36

यह मैं क्या कर रहा है। अगर आपको अपने कोड में इसे सिलाई करने में और मदद की ज़रूरत है तो कृपया टिप्पणी करें।

प्रथम चरण

एक अलग फाइल में अपने पासपोर्ट कोड रखो। जैसे pass.js. (मैं आप पहले से ही किया है कि देखें) फिर, उस फ़ाइल में, इस के अंदर सभी कोड डाल:

module.exports = function(passport, LocalStrategy){ 

}; 

समारोह इनपुट कुछ और है कि आप प्रयोग कर रहे हैं करने के लिए जोड़ने का ध्यान रखें। आपके मामले में, पासपोर्ट और लोकलस्ट्रेटी के अलावा, आपको शायद इनपुट के रूप में mongoDbConnection जोड़ने की आवश्यकता होगी।

दूसरा चरण

अपने app.js में, इस लाइन में शामिल हैं। यदि संभव हो तो "app.listen" से पहले यह सुनिश्चित करने के लिए कि सब कुछ ठीक से परिभाषित/घोषित/शामिल किया गया है।

require('./pass.js')(passport, LocalStrategy); 

स्पष्टीकरण

"आवरण" चरण एक में आप अपने एप्लिकेशन में शामिल किए जाएंगे कोड का हिस्सा परिभाषित करता है। चरण दो में "आवश्यकता" वह कोड है जो वास्तव में इसे शामिल करता है। आप मूल रूप से पूरे "pass.js" फ़ाइल को एक फ़ंक्शन के रूप में परिभाषित कर रहे हैं और इसे कोड (पासपोर्ट, लोकलस्ट्रेटी आदि)

अपने मामले में, आपको शायद मेरे कोड को संशोधित करने की आवश्यकता होगी :

module.exports = function(passport, LocalStrategy, mongoDbConnection){ 

}; 

require('./pass.js')(passport, LocalStrategy, mongoDbConnection); 

यह काम करना चाहिए। मैंने थोड़ी देर पहले इस बारे में गुमराह किया और यह आपके app.js को तोड़ने का "सही" तरीका प्रतीत होता है (हालांकि मैं इसे बहुत भयावहता के साथ कहता हूं :))। अगर आपको और मदद की ज़रूरत है तो टिप्पणी करने के लिए स्वतंत्र महसूस करें।

+0

चीयर्स लीजेंड्रे, जिसने चाल की। :) – DanyZift

+0

@DanyZift: यह जानकर बहुत खुशी हुई कि इससे मदद मिली! – Legendre

+0

@Legendre जीनियस! धन्यवाद! – shaunakde

3

इसके लिए मैं ऐप में ऐसा करने का सुझाव दूंगा।js

require('./mypassport')(app); 

और mypassport.js

var passport = require('passport') 
, LocalStrategy = require('passport-local').Strategy 

, MongoDBConnection = require('./database/DatabaseConnector').MongoDBConnection; 

    module.exports = function(app){ 

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

    passport.deserializeUser(function(id, done) { 
    mongoDbConnection.findUserById(id, function(err, user){ 
    done(err, user); 
    }); 

}); 

passport.use(new LocalStrategy(
function(username, password, done) { 
    process.nextTick(function() { 

     mongoDbConnection.findUser(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); 
     }); 
     }); 
} 
)); 
} 
0
module.exports = function(app){ 

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

हो सकता है कि यह does not काम क्योंकि यू एक पासपोर्ट वस्तु के लिए एक संदर्भ की जरूरत नहीं है?

0

लीजेंड्रे के उत्तर में जोड़ना। module.exports = function() एक आवेदन करने के लिए नोडजेज़ में एक तरीका है, एक चर या एक पूर्ण कार्यक्षमता जो पूरे आवेदन के लिए विश्व स्तर पर उपलब्ध है।

// anyfile.js 
    module.exports = function(){ 
    //global code. 
} 
संबंधित मुद्दे