পাসপোর্ট সিরিয়ালাইজ ডেসিরিয়াল বোঝা


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প্রদত্ত ব্যবহারকারীর বস্তুর কীটির সাথে সম্পর্কিত donesee (দেখুন 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
অনুভব

@ এ্যাব আমি আইডি থেকে ব্যবহারকারীকে খুঁজে পেতে কোড লিখেছিলাম যা প্রথম প্যারামিটার হিসাবে পদ্ধতিটি ডিসরিয়ালাইজ করার জন্য পাস করা হয়েছে। তবে প্রতিটি অনুরোধে এটি ব্যবহারকারীকে ডিবি থেকে পুনরুদ্ধার করছে। এটি ডিবির জন্য কর্মক্ষমতা হ্রাস করে। অধিবেশনটির উপস্থিতি আছে কি না তা যাচাই করতে ফাংশনটি ডিসেরায়ালাইজ করার জন্য আর কী লিখি?
uzay95

2
@ AB আপনি uzay95 এর জন্য কী পরামর্শ দিয়েছেন তা আমি বুঝতে পারি না। সুতরাং আমার সেশনে আমার কেবল ইউজার_আইডি রয়েছে। তবে প্রতিটি অনুরোধের ভিত্তিতে, আমাকে সেই আইডিটি ডেটাবেস ওরফে ফাইন্ড ইউজারবিআইডি থেকে ডিসরিয়ালাইজড করতে ব্যবহার করতে হবে এবং এটি এটিকে req.user এ রাখবে। আমি কীভাবে প্রতিটি অনুরোধে এই ধরনের কল করা এড়াতে পারি?
জাঙ্কো

10
@ জাঙ্কো আপনি পুরো ব্যবহারকারীর অবজেক্টটি সেশন ডেটাতে রেখে দিতে পারেন, তবে এটি সাধারণত ভাল ধারণা নয় কারণ এর অন্যান্য পার্শ্ব প্রতিক্রিয়াও থাকতে পারে। উদাহরণস্বরূপ, যখন ব্যবহারকারী তার / তার ব্যবহারকারীর নাম আপডেট করেন আপনাকেও সেশন ডেটা আপডেট করতে হবে, অন্যথায় আপনি "ভাঙা পুনঃনামকরণ বৈশিষ্ট্য" বলে টিকিট পাবেন। এটি তুলনামূলকভাবে নিরীহ উদাহরণ। অনুমতি বিট বা সমান সংবেদনশীল ডেটা (ওফ ...) দিয়ে একই ঘটতে পারে। আপনার ডুপ্লিকেট ডেটা থাকলে মূলত একই সমস্যা আপনি সর্বদা চালিত হন। টিএল; ডিআর - এটি করবেন না।
ম্যাক্স ট্রুক্সা

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কোন মানে হবে না।
অ্যাডাম জেরনার 19

21

যে কেউ কোয়া এবং কোয়া-পাসপোর্ট ব্যবহার করছে তার জন্য :

জেনে রাখুন যে সিরিয়ালাইজ ব্যবহারকারী পদ্ধতিতে ব্যবহারকারীর জন্য কী (সাধারণত সেই ব্যবহারকারীর জন্য একটি অনন্য আইডি) সংরক্ষণ করা হবে:

this.session.passport.user

আপনি যখন done(null, user)ডিজিটালাইজ ইউজারে সেট করেন যেখানে 'ব্যবহারকারী' আপনার ডাটাবেস থেকে কিছু ব্যবহারকারী অবজেক্ট থাকে:

this.req.user অথবা this.passport.user

কোনও কারণে this.userআপনি যখন আপনার ডিসিরিয়ালাইজ ব্যবহারকারী পদ্ধতিতে সম্পন্ন (নাল, ব্যবহারকারী) কল করেন তখন কোআ প্রসঙ্গটি কখনই সেট হয় না।

সুতরাং আপনি এটিকে এটিকে ব্যবহার করার জন্য অ্যাপ.ইউজে (পাসপোর্ট.অ্যাসিওশন ()) এ কল করার পরে নিজের মিডলওয়্যারটি লিখতে পারেন:

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

সিরিয়ালাইজ ইউজার এবং ডিসরিয়ালাইজ ব্যবহারকারী কীভাবে কাজ করে সে সম্পর্কে আপনি যদি অস্পষ্ট হন তবে কেবল টুইটারে আমাকে আঘাত করুন। @yvanscher


এখানে নেক্রোপোস্টিংয়ের জন্য দুঃখিত, তবে ডিসিরিয়ালাইজ ব্যাখ্যা পড়ার পরে আমার এখন উদ্বেগ আছে। আমি এখানে এসও নিয়ে একটি প্রশ্ন পোস্ট করেছি: stackoverflow.com/questions/54154047/…
পিটার কেলনার

দুর্দান্ত সহায়ক, তবে এখনও অন্য রুটগুলি থেকে ব্যবহারকারীকে পড়তে কিছু সমস্যা রয়েছে। কেউ কি আমাকে এখানে সাহায্য করতে পারবেন? stackoverflow.com/questions/60709882/…
হ্যারি লিংকন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.