पासपोर्ट को समझना डीसेरिएलाइज़ करता है


337

आप पासपोर्ट की क्रमबद्धता और एक आम आदमी के लिए तरीकों के वर्णन को कैसे समझाएंगे।

  1. कहा user.idजाने के बाद कहाँ passport.serializeUserजाता है?

  2. हम passport.deserializeUserइसे सही कह रहे हैं इसके बाद यह वर्कफ़्लो में कहाँ फिट होता है?

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id); 
       // where is this user.id going? Are we supposed to access this anywhere?
    });
    
    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });

मैं अभी भी इसके चारों ओर अपना सिर लपेटने की कोशिश कर रहा हूं। मेरे पास एक पूरा काम करने वाला ऐप है और मैं किसी भी तरह की त्रुटियों में नहीं चल रहा हूं।

मैं बस समझना चाहता था कि वास्तव में यहाँ क्या हो रहा है?

किसी भी मदद की सराहना की है।

जवाबों:


452
  1. कहा user.idजाने के बाद कहाँ passport.serializeUserजाता है?

उपयोगकर्ता आईडी (आप doneफ़ंक्शन के दूसरे तर्क के रूप में प्रदान करते हैं ) को सत्र में सहेजा जाता है और बाद में deserializeUserफ़ंक्शन के माध्यम से पूरे ऑब्जेक्ट को पुनर्प्राप्त करने के लिए उपयोग किया जाता है ।

serializeUserयह निर्धारित करता है कि सत्र में उपयोगकर्ता ऑब्जेक्ट का कौन सा डेटा संग्रहीत किया जाना चाहिए। सीरीज़यूज़र विधि का परिणाम सत्र के रूप में जुड़ा हुआ है req.session.passport.user = {}। उदाहरण के लिए, यह होगा (जैसा कि हम उपयोगकर्ता आईडी कुंजी के रूप में प्रदान करते हैं)req.session.passport.user = {id: 'xyz'}

  1. हम passport.deserializeUserइसे सही कह रहे हैं इसके बाद यह वर्कफ़्लो में कहाँ फिट होता है?

deserializeUserउपयोगकर्ता ऑब्जेक्ट की कुंजी से मेल खाने वाला पहला तर्क जो doneफ़ंक्शन को दिया गया था (देखें 1.)। तो आपकी पूरी वस्तु को उस कुंजी की मदद से पुनः प्राप्त किया जाता है। यहाँ वह कुंजी उपयोगकर्ता आईडी है (कुंजी उपयोगकर्ता वस्तु का कोई भी कुंजी हो सकती है, नाम, ईमेल आदि)। में deserializeUserहै कि कुंजी सरणी / डेटाबेस या किसी भी डेटा संसाधन स्मृति में साथ मिलान किया जाता है।

प्राप्त वस्तु अनुरोध वस्तु के रूप में संलग्न है req.user

दृश्य प्रवाह

passport.serializeUser(function(user, done) {
    done(null, user.id);
});              
                  
                 
                 └─────────────────┬──→ saved to session
                                       req.session.passport.user = {id: '..'}
                                   
                                              
passport.deserializeUser(function(id, done) {
                   ┌───────────────┘
                   
                    
    User.findById(id, function(err, user) {
        done(err, user);
    });            └──────────────→ user object attaches to the request as req.user   
});

2
तो के user.idरूप में सहेजा जाता है req.session.passport.userया userखुद के रूप में संग्रहीत किया जाता हैreq.session.passport.user
Anubhav

@AB मैंने आईडी से उपयोगकर्ता को खोजने के लिए कोड लिखा है जो पहले पैरामीटर के रूप में विधि को डिसेरियलाइज़ करने के लिए पारित किया गया है। लेकिन हर अनुरोध में यह db से उपयोगकर्ता को पुनः प्राप्त कर रहा है। यह db के लिए प्रदर्शन हानि करता है। यह जाँचने के लिए कि मुझे सत्र पर मौजूद है या नहीं, मुझे डिसेरियलाइज़ फंक्शन को और क्या लिखना चाहिए?
uzay95

2
@AB मुझे समझ नहीं आ रहा है कि आपने uzay95 को क्या सुझाव दिया है। इसलिए मेरे सत्र में मेरे पास केवल user._id है। लेकिन हर अनुरोध पर, मुझे उस आईडी का उपयोग डेटाबेस उर्फ ​​findUserByID से deserialized करने के लिए करना होगा और वह इसे req.user में डाल देगा। मैं हर अनुरोध पर ऐसी कॉल करने से कैसे बचूँ?
ज़ैंको

10
@Zanko आप पूरे उपयोगकर्ता ऑब्जेक्ट को सत्र डेटा में डाल सकते हैं, लेकिन यह आमतौर पर एक अच्छा विचार नहीं है क्योंकि इसके अन्य दुष्प्रभाव हो सकते हैं। उदाहरण के लिए, जब उपयोगकर्ता अपने उपयोगकर्ता नाम को अपडेट करता है, तो आपको सत्र डेटा भी अपडेट करना होगा, अन्यथा आपको "टूटी हुई पुनर्विक्रय सुविधा" के कारण टिकट मिलेंगे। यह अपेक्षाकृत हानिरहित उदाहरण है। वही अनुमति बिट्स या समान संवेदनशील डेटा (ओह ...) के साथ हो सकता है। अनिवार्य रूप से वही समस्याएं जो आप हमेशा चलाते हैं यदि आपके पास डुप्लिकेट डेटा है। टीएल; डीआर - यह मत करो।
मैक्स ट्रूका

1
अगर मैं गलत नहीं हूँ, req.session.passport.user = {id: '..'}आरेख का हिस्सा थोड़ा दूर है, और होना चाहिए req.session.passport.user = 785352बजाय, जहां 785352है user.id। मुझे यह साबित करने के लिए लॉग इन करने में परेशानी हो रही है, लेकिन ऐसा लगता है कि यह समझ में आएगा। जब आप कॉल करते हैं done(null, user.id);, तो user.idइस मामले में दूसरा तर्क लेने के लिए यह समझ में आएगा - और इसे असाइन करने req.session.passport.userके बजाय इसे असाइन करें req.session.passport.user.id। क्योंकि अगर तुम बदले में पास हो तो क्या होगा user? req.sesssion.passport.user.id = userसमझ में नहीं आएगा।
एडम ज़र्नर

21

कोआ और कोआ-पासपोर्ट का उपयोग करने वाले किसी के लिए :

जानते हैं कि क्रमबद्ध विधि (अक्सर उस उपयोगकर्ता के लिए एक विशिष्ट आईडी) में रखी गई उपयोगकर्ता के लिए कुंजी इसमें संग्रहीत की जाएगी:

this.session.passport.user

जब आप done(null, user)deserializeUser में सेट करते हैं जहां 'उपयोगकर्ता' आपके डेटाबेस से कुछ उपयोगकर्ता ऑब्जेक्ट है:

this.req.user या this.passport.user

किसी कारण से this.userजब आप अपने deserializeUser मेथड (null, user) को कॉल करते हैं तो Koa संदर्भ कभी सेट नहीं होता है।

तो आप app.use (passport.session ()) को कॉल करने के बाद अपना खुद का मिडलवेयर लिख सकते हैं।

app.use(function * setUserInContext (next) {
  this.user = this.req.user
  yield next
})

यदि आप स्पष्ट नहीं हैं कि कैसे serializeUser और deserializeUser काम करते हैं, तो बस मुझे ट्विटर पर मारा। @yvanscher


यहाँ necroposting के लिए खेद है, लेकिन मुझे deserialize स्पष्टीकरण पढ़ने के बाद अब एक चिंता है। मैंने इसके बारे में SO पर यहां एक प्रश्न पोस्ट किया है: stackoverflow.com/questions/54154047/…
पीटर केल्नर

सुपर उपयोगी है, लेकिन अभी भी कुछ मुद्दों को अन्य मार्गों से उपयोगकर्ता को पढ़ रहा है। क्या कोई यहाँ मेरी मदद कर सकता है? stackoverflow.com/questions/60709882/…
हैरी लिंकन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.