2012-06-26 16 views
6

साथ Node.js प्रमाणीकरण पुस्तकालय मैं passport for node काम करने का ज्ञान है, लेकिन यह इस तरह के रूप बातें नहीं है: (जैसे authlogic/session/session.rb#L35 में के रूप में एक "हठ टोकन" पैदा करने"हठ टोकन" कार्यक्षमता

  • पासवर्ड के लिए जल्दी खराब होने वाले टोकन पैदा रीसेट करता है
  • मुझे कार्यक्षमता
  • आदि, कुछ मॉडल वर्ग पर लॉगिन/लॉगआउट के लिए उन संपत्तियों का प्रबंधन
याद

क्या कोई पुस्तकालय है जिसने इसे नोड.जेएस समुदाय में हल किया है? यदि Devise for Rails के रूप में मजबूत (या मजबूत होने के तरीके पर) कुछ भी है, तो यह सही होगा, लेकिन इस टोकन मुद्दे को हल करने वाला कुछ भी ठीक काम करेगा।

पागल बात यह है कि सत्र में उपयोगकर्ता id उपयोगकर्ता को संग्रहीत कर रहे हैं!

request.session['userId'] = user.get('id') 

यह सिर्फ हैक होने के लिए कह रहा है।

require.session['persistenceToken'] = App.User.generateRandomToken() 
+0

मुझे लगता है कि इसे लागू करना मुश्किल नहीं है, बस इच्छा है कि यह पहले से मौजूद है। –

+0

मैंने एक साथ "मुझे याद रखें" रणनीति बनाई है: https://github.com/jaredhanson/passport-remember-me –

उत्तर

8

एक बार ही पासवर्ड (उर्फ एकल-उपयोग टोकन) पासवर्ड फिर सेट करता है के लिए रणनीति कुछ है कि मैं लागू करेंगे है:

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

मुझे याद रखें और दृढ़ता टोकन कार्यक्षमता भी कुछ है जिसे मैं समर्थन देना चाहता हूं। अधिमानतः, मैं चाहता हूं कि यह एक अलग रणनीति भी हो, लेकिन इसे कुछ मूल समर्थन की आवश्यकता हो सकती है। यदि यह मामला सामने आता है, तो req.logIn (https://github.com/jaredhanson/passport/blob/master/lib/passport/http/request.js#L28) में कुछ अतिरिक्त लाइनें इसे कवर करने में सक्षम होना चाहिए।

सत्र में उपयोगकर्ता आईडी संग्रहीत करने के लिए, मुझे कोई बड़ा जोखिम नहीं दिखता है, डिफ़ॉल्ट रूप से कनेक्ट/एक्सप्रेस में, सत्र गुण पूरी तरह से बैकएंड में संग्रहीत होते हैं और एक अद्वितीय sid सेट किए जाते हैं एक एन्क्रिप्टेड कुकी में। अनुरोधों को धोखा देने के लिए एक दुर्भावनापूर्ण उपयोगकर्ता को अद्वितीय सिड और सत्र रहस्य दोनों रखना होगा।

मोज़िला ब्राउज़र पहचान को कम करने वाले अन्य प्रदाताओं के लिए ब्राउज़र आईडी को पुल करने के लिए पासपोर्ट का उपयोग अपने पहचान प्रयास के हिस्से के रूप में कर रहा है (browserid-bigtent देखें)। उनकी आवश्यकताओं को देखते हुए, डेवलपर्स यह सुनिश्चित कर सकते हैं कि पासपोर्ट सख्त सुरक्षा आवश्यकताओं को पूरा करता है।

(आखिरकार पासपोर्ट में सत्र क्रमबद्धता एक आवेदन की ज़िम्मेदारी है, इसलिए सुरक्षा आईडी के लिए वांछित होने पर उपयोगकर्ता आईडी के स्थान पर एक यादृच्छिक टोकन का उपयोग किया जा सकता है। स्पष्ट रूप से यह कुकी में सीधे डेटा संग्रहीत करने पर किया जाना चाहिए, लेकिन मैं ' डी सुझाव देते हैं कि ऐसा करना सबसे खराब सलाह है।)

मॉडल पर उन गुणों का प्रबंधन करने के लिए, पासपोर्ट को पूरी तरह से मॉडल/ओआरएम अज्ञेयवादी के रूप में डिजाइन किया गया है। मैं इस तथ्य को कभी भी बदलने का इरादा नहीं रखता, क्योंकि मुझे लगता है कि उन निर्णयों को एप्लिकेशन के लिए सबसे अच्छा छोड़ दिया गया है (और इस जिम्मेदारी को सौंपने के परिणामस्वरूप पासपोर्ट अधिक लचीला है)। उस ने कहा, मुझे लगता है कि इस कार्यक्षमता को प्रदान करने के लिए पासपोर्ट के शीर्ष पर स्वतंत्र रूप से अन्य मॉड्यूल बनाने के लिए जगह है।

जो कुछ भी कहा गया, मुझे लगता है कि पासपोर्ट मौजूदा नोड.जेएस ऑथ समाधानों का सबसे मजबूत है।आपके पहले तीन अनुरोध इसे और अधिक बनाने के लिए एक लंबा सफर तय करेंगे, और उन्हें पूरा करना आसान होना चाहिए। मुझे इन सुविधाओं को प्राप्त करने में सहयोग करना अच्छा लगेगा, इसलिए मेरे साथ संपर्क करने में संकोच न करें।

अंत में, यदि कोई उत्सुक है, तो प्रथम श्रेणी के एपीआई प्रमाणीकरण वर्तमान में authinfo शाखा पर कामों में है। इस पर बिल्डिंग, passport-http-oauth ओएथ सर्वर रणनीतियों को लागू करता है, जिसे ओथ सर्वरों को इकट्ठा करने के लिए टूलकिट के रूप में oauthorize मिडलवेयर के साथ जोड़ा जा सकता है। यह अभी तक पूरी तरह से पकाया नहीं गया है, लेकिन यह तैयार होने पर पासपोर्ट की एक और प्रभावी विशेषता होगी।

+0

मैं स्थानीय प्रमाणीकरण रणनीति के साथ पासपोर्ट का उपयोग कर रहा हूं और याद रखें मुझे याद रखें। क्या मैं किसी भी तरह से अपने serializeUser() फ़ंक्शन ro में कुकी लाइफस्टाइल सेट कर सकता हूं क्या मुझे कोर हैक करना है? या कुछ और? – ragulka

2

इस बीच, निम्नलिखित की तरह कुछ होना पर्याप्त होना चाहिए। अपने ऐप और वांछित कुकी अवधि फिट करने के लिए आवश्यक समायोजित करें। उपयोगकर्ता नाम & पासवर्ड के लिए जांच एक लॉगिन प्रयास का पता लगाने के लिए एक प्रकार का प्यारा तरीका है, लेकिन यह पासपोर्ट के साथ काफी अच्छी तरह से काम करता है।

app.use(function(req, res, next) { 
    if(
      typeof(req.body.username) !== "undefined" 
      && typeof(req.body.password) !== "undefined" 
      ) { 
     if(req.body.remember == 1) { 
      req.session.cookie.maxAge = 365*24*60*60*1000; 
     } 
     else { 
      req.session.cookie.maxAge = 24*60*60*1000; 
     } 
    } 
    next(); 
}); 
+0

मुझे आश्चर्य है कि 'res.session.cookie.maxAge = null; '' else' कथन के अंदर' क्यों काम नहीं करेगा? मैंने कोशिश की, और यदि मैं "याद रखें" विकल्प के साथ एक बार लॉग इन करता हूं तो सत्य पर सेट किया जाता है, तो बाद के सभी लॉग इन में एक सतत कुकी सेट भी होगा, भले ही "मुझे याद रखें" बंद हो। – ragulka

+0

मुझे अभी एहसास हुआ कि मुझे 'req.session.cookie.expires = false' का उपयोग करना चाहिए था, मैं इस प्रश्न का वैकल्पिक उत्तर पोस्ट करूंगा। – ragulka

2

जबकि मैं निश्चित रूप से पासपोर्ट.जेएस में इन विशेषताओं को देखना पसंद करूंगा, वे अभी तक नहीं हैं।

मैंने passport.js serilizeUser() फ़ंक्शन के साथ उपयोग करने के लिए एक साधारण यादृच्छिक टोकन जेनरेटर बनाया है, और जस्टेन के उत्तर को मेरी आवश्यकताओं के अनुरूप थोड़ा सा संशोधित किया है। असल में, केवल अंतर यह है कि यदि "याद रखें" विकल्प सेट नहीं किया गया है, तो सत्र तब तक चलता रहेगा जब तक ब्राउज़र खुला रहता है।

यह मेरा धारावाहिक है जो यादृच्छिक एक्सेस टोकन जेनरेटर के साथ है। मैं मोंगोद और मोंगोस का उपयोग कर रहा हूं, लेकिन कार्यान्वयन को अन्य प्रणालियों में अच्छी तरह से अनुवाद करना चाहिए।

असल में, मुझे समय मिल रहा है और इसमें यादृच्छिक 16-वर्ण वाली स्ट्रिंग जोड़ रही है। फिर, serializeUser() फ़ंक्शन में मैं जांचता हूं कि किसी अन्य उपयोगकर्ता के पास समान टोकन नहीं है (टोकन अद्वितीय होना चाहिए!)।

User.methods.generateRandomToken = function() { 
    var user = this, 
     chars = "_!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 
     token = new Date().getTime() + '_'; 
    for (var x = 0; x < 16; x++) { 
    var i = Math.floor(Math.random() * 62); 
    token += chars.charAt(i); 
    } 
    return token; 
}; 

यहाँ serializer है:

passport.serializeUser(function (user, done) { 

    var createAccessToken = function() { 
    var token = user.generateRandomToken(); 
    app.User.findOne({ accessToken: token }, function (err, existingUser) { 
     if (err) return done(err); 
     if (existingUser) 
     createAccessToken(); // Run the function again - the token has to be unique! 
     else { 
     user.set('accessToken', token); 
     user.save(function (err) { 
      if (err) return done(err); 
      return done(null, user.get('accessToken')); 
     }) 
     } 
    }); 
    }; 

    if (user._id) { 
    createAccessToken(); 
    } 
}); 

... और यहाँ मिडलवेयर कि "मुझे याद रखें" कार्यक्षमता संभालती है की मेरी संस्करण है। हालांकि, मैं इसे किसी भी तरह से serializeUser फ़ंक्शन या passport.js कोर का हिस्सा बनूंगा, हालांकि।

app.use(express.session({ secret: 'secret_key' })); 
app.use(function (req, res, next) { 
    if (req.method == 'POST' && req.url == '/login') { 
     if (req.body.remember) { 
     req.session.cookie.maxAge = 30*24*60*60*1000; // Rememeber 'me' for 30 days 
     } else { 
     req.session.cookie.expires = false; 
     } 
    } 
    next(); 
}); 
app.use(passport.initialize()); 
app.use(passport.session()); 

मुझे उम्मीद है कि किसी भी तरह से मदद करता है। मुझे इसे समझने में कुछ घंटे लग गए और मुझे पूरा यकीन नहीं है कि यह सर्वोत्तम ऐसा करने का तरीका है, लेकिन यह मेरे लिए अभी काम करता है।

+0

मुझे पता है कि यह वास्तव में पुराना है, लेकिन यहां सत्र मिडलवेयर का उपयोग कैसे किया जा रहा है? क्या हम इसे छोड़ नहीं सकते? –

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