2012-04-15 13 views
66

मैं अपने nodejs + express.js एप्लिकेशन पर ऑथ को संभालने के लिए passport.js का उपयोग करता हूं। मैं उपयोगकर्ताओं को mongodbNode.js + express.js + passport.js: सर्वर के बीच प्रमाणीकृत रहें

से उपयोगकर्ताओं को लेने के लिए एक स्थानीयस्ट्रेटी सेट अप करता है मेरी समस्या यह है कि उपयोगकर्ताओं को मेरे नोड सर्वर को पुनरारंभ करते समय पुन: प्रमाणीकरण करना होगा। यह एक समस्या है के रूप में मैं सक्रिय रूप से इसे विकसित करने कर रहा हूँ और प्रत्येक पुनरारंभ पर लॉगइन करने के लिए wan't नहीं ... (+ मैं नोड पर्यवेक्षक का उपयोग करें)

यहाँ मेरी एप्लिकेशन सेटअप है:

app.configure(function(){ 
    app.use('/static', express.static(__dirname + '/static')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(express.session({secret:'something'})); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(app.router); 
}); 

और सत्र serializing स्थापना:

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

passport.deserializeUser(function(email, done) { 
    User.findOne({email:email}, function(err, user) { 
     done(err, user); 
    }); 
}); 

मैं एक ब्लॉग पर दिए गए समाधान की कोशिश की (लिंक के रूप में यह किसी भी अधिक मौजूद नहीं है हटाया) सफलता के बिना कनेक्ट-MongoDB का उपयोग कर

app.use(express.session({ 
    secret:'something else', 
    cookie: {maxAge: 60000 * 60 * 24 * 30}, // 30 days 
     store: MongoDBStore({ 
     db: mongoose.connection.db 
    }) 
})); 

संपादित अतिरिक्त समस्या: केवल एक कनेक्शन बनाया जाना चाहिए

संपादित 2 समाधान (एक कनेक्शन सीमित mongohq नि: शुल्क सेवा का उपयोग) (मैं अपने प्रतिष्ठा के रूप में एक संस्करण के रूप में कम करने के लिए है से मेरे सवाल का जवाब करने के लिए अब

यहाँ समाधान मैं अंत में, पाया नेवला शुरू की कनेक्शन

app.use(express.session({ 
    secret:'awesome unicorns', 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore(
     {db:mongoose.connection.db}, 
     function(err){ 
      console.log(err || 'connect-mongodb setup ok'); 
     }) 
})); 
+0

बस एफवाईआई: उस ब्लॉग लिंक ने मुझे एक अस्पष्ट डेटिंग साइट पर रीडायरेक्ट किया ... पता नहीं है कि यह अब अच्छा है या नहीं। – anthonylawson

+1

ओह ठीक है, मैंने लिंक हटा दिया। –

+11

डेवलपर स्कूबी डेटिंग साइटें बनाते हैं। –

उत्तर

54

एक खुला स्रोत connect-mongo कहा जाता है कि आप वास्तव में क्या जरूरत नहीं है - सत्र डेटा MongoDB में

के उपयोग का उदाहरण (mongoose के पुन: उपयोग के साथ बनी रहती है खोला कनेक्शन):

var session = require('express-session'); 
var MongoStore = require('connect-mongo')(session); 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/sess'); 
app.use(express.session({ 
    secret:'secret', 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore(
    // Following lines of code doesn't work 
    // with the connect-mongo version 1.2.1(2016-06-20). 
    // {db:mongoose.connection.db}, 
    // function(err){ 
    //  console.log(err || 'connect-mongodb setup ok'); 
    // } 
    {mongooseConnection:mongoose.connection} 
    )   
})); 

आप इसके बारे में यहाँ और अधिक पढ़ सकते हैं: https://github.com/kcbanner/connect-mongo

+1

अर्नुद, धन्यवाद, मुझे एक ही समस्या है। क्या आप डीबी के बारे में अधिक स्पष्ट हो सकते हैं: mongoose.connection.db? मुझे यकीन है कि इसका मतलब क्या है। –

+0

मुझे देर से प्रतिक्रिया के लिए खेद है, मैं मेक्सिको से फ्रांस वापस यात्रा कर रहा हूं, मैं 48h में अधिक उपलब्ध होगा। प्रतिक्रिया: ठीक है, आपको mongoose द्वारा प्रारंभ किए जाने के बाद कनेक्ट-मोंगोडब को मोंगो कनेक्शन उदाहरण पास करना होगा। mongoose.connection.db उदाहरण है जिसके बारे में हम बात कर रहे हैं, हम इसे "डीबी" विशेषता के माध्यम से कनेक्ट करने के लिए पास करते हैं। –

+0

क्या आपके पास # गीथूब पर एक कामकाजी उदाहरण है? –

5

का उपयोग कर इसका कारण यह है कि आप सत्र के लिए MemoryStore (डिफ़ॉल्ट) का उपयोग करें। memory.js से इस कोड (कनेक्ट ढांचे का हिस्सा) को देखो:

var MemoryStore = module.exports = function MemoryStore() { 
    this.sessions = {}; 
}; 

और session.js (एक्सप्रेस) से इस स्निपेट

function session(options){ 
    /* some code */ 
    , store = options.store || new MemoryStore 
    /* some code */ 
} 

अब आप को समझना चाहिए कि हर सर्वर पुनः आरंभ MemoryStore रीसेट करता है । डेटा को रखने के लिए आपको कुछ अन्य सत्र स्टोर का उपयोग करना होगा। आप अपना खुद का भी लिख सकते हैं (बहुत मुश्किल नहीं होना चाहिए), हालांकि रेडिस (this library देखें) एक अच्छा विकल्प हो सकता है (और यह एक्सप्रेस द्वारा समर्थित है)।

// संपादित

the Connect documentation के अनुसार यह अगर तुम get, set और destroy तरीकों को लागू करने के लिए पर्याप्त है। निम्नलिखित कोड काम करना चाहिए:

customStore = { 
    get : function(sid, callback) { 
     // custom code, for example calling MongoDb 
    }, 
    set : function(sid, session, callback) { 
     // custom code 
    }, 
    destroy : function(sid, callback) { 
     // custom code 
    } 
}  

app.use(express.session({ 
    store: customStore 
})); 

तुम बस सत्र डेटा भंडारण के लिये (हालांकि मैं अभी भी Redis तरह nonpermament एक का उपयोग की सलाह देते हैं या किसी अन्य Db) MongoDB बुला लागू करना होगा। विचार को पकड़ने के लिए अन्य कार्यान्वयन के स्रोत कोड को भी पढ़ें।

+1

धन्यवाद। जैसा कि आप देख सकते हैं, मैंने सफलता के बिना कनेक्ट-मोंगोडब (और कनेक्ट-मोंगो) का उपयोग करने का प्रयास किया है, सत्र मेरे डीबी में सहेजे नहीं गए हैं। –

+1

@ArnaudRinquin क्षमा करें, किसी भी तरह से मैंने इसे नहीं देखा। :) मैंने जवाब अपडेट किया है। मैं न तो कनेक्ट-मोंगोडब और न ही कनेक्ट-मोंगो से परिचित नहीं हूं (मैं एक सत्र स्टोर के रूप में रेडिस के साथ मोंगोज़ का उपयोग कर रहा हूं) इसलिए मेरे लिए एकमात्र सलाह यह है: सत्र स्टोर को स्वयं लागू करने का प्रयास करें। – freakish

+0

आपकी मदद के लिए धन्यवाद लेकिन मुझे कुछ मिनट पहले समाधान मिला है और मैंने आपकी प्रतिक्रिया देखी क्योंकि मैं समाधान पोस्ट करना चाहता था। –

6

मैं बहुत तरह कनेक्ट-मोंगो का उपयोग करें:

var MongoStore = require('connect-mongo'); 

var sess_conf = { 
    db: { 
    db: mydb, 
    host: localhost, 
    collection: 'usersessions' // optional, default: sessions 
    }, 
    secret: 'ioudrhgowiehgio' 
}; 

app.use(express.session({ 
    secret: sess_conf.secret, 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore(sess_conf.db) 
    })); 


[...] 

// Initialize Passport! Also use passport.session() middleware, to support 
    // persistent login sessions (recommended). 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
+0

धन्यवाद लेकिन मुझे एक अतिरिक्त समस्या है: मैं अपने डेटा बेस पर केवल एक कनेक्शन चाहता हूं क्योंकि मैं मोन्गोक मुक्त सेवा (केवल एक कनेक्शन) का उपयोग करता हूं। –

+0

ठीक है यहां कनेक्ट-मोंगोडब का उपयोग करके अंतिम, साफ समाधान है और मोंगोस कनेक्शन का उपयोग कर –

1

मैं mongoose का उपयोग कर रहा हूं, मैंने ऊपर दिए गए उत्तरों में प्रस्तुत कोड की कोशिश की और यह मेरे लिए काम नहीं किया।

Error: db object already connecting, open cannot be called multiple times 

बहरहाल, यह मेरे लिए काम करता:

app.use(express.session({ 
    secret:'secret', 
    maxAge: new Date(Date.now() + 3600000), 
    store: new MongoStore({mongoose_connection:mongoose.connection}) 
})) 

नोट: जब मैंने किया था मैं यह त्रुटि आई

: यदि आप किसी भी कारण से MongoStore की जरूरत नहीं है, तो आप क्या करने की जरूरत
npm install connect-mongo --save 

तो:

var MongoStore = require('connect-mongo')(express) 
2

यह probab है अनुभवी नोड उपयोगकर्ताओं के लिए स्पष्ट है लेकिन यह मुझे बाहर पकड़ा:

आपको नोड सत्र को कॉन्फ़िगर करने की आवश्यकता है - उदा।

app.use(session({secret: "this_is_secret", store: ...})); 

से पहले पासपोर्ट सत्र आरंभ - जैसे

app.use(passport.initialize()); 
app.use(passport.session()); 

यदि आप passport.session() पहले कॉल करते हैं तो यह काम नहीं करेगा (और यह आपको चेतावनी नहीं देगा)। मैंने सोचा था कि समस्या उपयोगकर्ता के कार्यों को क्रमबद्ध/deserialize और बर्बाद घंटे के साथ था।

var expressSession = require('express-session'); 
var redisClient = require('redis').createClient(); 
var RedisStore = require('connect-redis')(expressSession); 
... 
app.use(expressSession({ 
    resave: true, 
    saveUninitialized: true, 
    key: config.session.key, 
    secret: config.session.secret, 
    store: new RedisStore({ 
     client: redisClient, 
     host: config.db.host, 
     port: config.db.port, 
     prefix: 'my-app_', 
     disableTTL: true 
    }) 
})); 

वर्क्स मेरे लिए:

1
क्या मैं कर रहा समाप्त हो गया

1

आपको अपने सत्र के लिए उपयोग की जाने वाली स्टोर को बदलने की आवश्यकता है। जब आप एप्लिकेशन बंद हो जाते हैं तो डिफ़ॉल्ट 'मेमोरीस्टोर' सत्र को संग्रहीत नहीं करता है। मोंगो की तरह अन्य स्टोरों के बारे में और जानने के लिए जिथब पर एक्सप्रेस-सत्र देखें। (नाम याद नहीं कर सकता)

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