পাসপোর্ট.অ্যাসিওশন () মিডলওয়্যার কী করে?


125

আমি সহজ নোড প্রমাণীকরণ: সেটআপ এবং স্থানীয় টিউটোরিয়াল ব্যবহার করে Passport.js ব্যবহার করে একটি প্রমাণীকরণ সিস্টেম তৈরি করছি ।

আমি যা করি তা নিয়ে বিভ্রান্ত হয়ে পড়েছি passport.session()

বিভিন্ন মিডলওয়্যারের সাথে ঘুরে দেখার পরে আমি বুঝতে পারি যে express.session()এটিই ক্লায়েন্টের কাছে কুকিজের চেয়ে একটি সেশন আইডি প্রেরণ করে তবে আমি কী করব passport.session()এবং এটি ছাড়াও এটির প্রয়োজন কী তা নিয়ে আমি বিভ্রান্ত express.session()

আমি এখানে আমার অ্যাপ্লিকেশনটি সেট আপ করব:

// সার্ভার.জেএস অ্যাপ্লিকেশনটি কনফিগার করে এবং ওয়েব সার্ভার সেট আপ করে

//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');

var configDB = require('./config/database.js');

//Configuration of Databse and App

mongoose.connect(configDB.url); //connect to our database

require('./config/passport')(passport); //pass passport for configuration

app.configure(function() {

    //set up our express application

    app.use(express.logger('dev')); //log every request to the console
    app.use(express.cookieParser()); //read cookies (needed for auth)
    app.use(express.bodyParser()); //get info from html forms

    app.set('view engine', 'ejs'); //set up ejs for templating

    //configuration for passport
    app.use(express.session({ secret: 'olhosvermelhoseasenhaclassica', maxAge:null })); //session secret
    app.use(passport.initialize());
    app.use(passport.session()); //persistent login session
    app.use(flash()); //use connect-flash for flash messages stored in session

});

//Set up routes
require('./app/routes.js')(app, passport);

//launch
app.listen(port);
console.log("Server listening on port" + port);

উত্তর:


139

passport.session() মিডিয়াওয়্যার হিসাবে কাজ করে রেকর্ড অবজেক্টকে পরিবর্তন করতে এবং 'ব্যবহারকারীর' মানটি যা বর্তমানে সেশন আইডি (ক্লায়েন্ট কুকি থেকে) সত্য ডিসরিয়ালাইজড ইউজার অবজেক্টে রূপান্তরিত করে।

অন্যান্য উত্তরগুলি কিছু ভাল পয়েন্ট তৈরি করার সময় আমি ভেবেছিলাম যে আরও কিছু নির্দিষ্ট বিশদ সরবরাহ করা যেতে পারে।

app.use(passport.session());

সমতুল্য

app.use(passport.authenticate('session'));

যেখানে 'সেশন' নিম্নলিখিত কৌশলটিকে বোঝায় যা পাসপোর্টজেএস-এর সাথে একত্রিত হয়।

https://github.com/jaredhanson/passport/blob/master/lib/strategies/session.js

বিশেষত লাইন 59-60:

var property = req._passport.instance._userProperty || 'user';
req[property] = user;

যেখানে এটি মূলত মিডওয়্যার হিসাবে কাজ করে এবং ব্যবহারকারীর deserialized পরিচয় রেকর্ড অবজেক্টে 'ব্যবহারকারীর' বৈশিষ্ট্যের মান পরিবর্তন করে। এটি সঠিকভাবে কাজ করার জন্য আপনাকে অবশ্যই আপনার কাস্টম কোডে অন্তর্ভুক্ত থাকতে হবে serializeUserএবং deserializeUserফাংশন করতে হবে ।

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

passport.deserializeUser(function (user, done) {
    //If using Mongoose with MongoDB; if other you will need JS specific to that schema.
    User.findById(user.id, function (err, user) {
        done(err, user);
    });
});

এটি ডাটাবেস থেকে সঠিক ব্যবহারকারীর সন্ধান করবে এবং এটিকে কলব্যাকের মধ্যে ক্লোজার ভেরিয়েবল হিসাবে পাস করবে done(err,user);যাতে ক্যানের উপরের কোডটি passport.session()রেেক বস্তুতে 'ব্যবহারকারীর' মানটি প্রতিস্থাপন করতে পারে এবং পাইলের পরবর্তী মিডওয়্যারের কাছে যেতে পারে।


আরে, আমি কীভাবে সেশনে ব্যবহারকারীর বিবরণগুলি কেবলমাত্র ডেটাবেসে সংরক্ষণ করতে চাই না
নিউবি

1
"অনুরোধ শিরোনামে"? কোনও অনুরোধের অবজেক্টে নেই
19:25

আমি লক্ষ করেছি যে সেশন কৌশলটি যদি লেখককে পুনরুদ্ধার করতে এবং ব্যবহারকারীকে deserialize করতে সক্ষম হয়। তবে তা সত্ত্বেও প্রমাণীকরণটি পরবর্তী কৌশলতে চলে আসে যা আমার দৃশ্যে ফেসবুক লেখক। আমি অবাক হয়েছি যে সেশনটি ব্যবহারকারী পুনরুদ্ধার করতে সক্ষম হয়েও যদি এটি নিম্নলিখিত কৌশলগুলি চালিয়ে যেতে থাকে তবে সেশন কৌশলটির মূল বিষয়টি কী point
নিশান্ত

15

ডকুমেন্টেশন থেকে

একটি কানেক্ট বা এক্সপ্রেস-ভিত্তিক অ্যাপ্লিকেশনে, পাসপোর্ট.ইনাইটালাইজ () মিডওয়্যারটি পাসপোর্ট শুরু করার প্রয়োজন। যদি আপনার অ্যাপ্লিকেশন অবিচ্ছিন্ন লগইন সেশন ব্যবহার করে তবে পাসপোর্ট.অ্যাসিওশন () মিডলওয়্যারটি অবশ্যই ব্যবহার করা উচিত।

এবং

দায়রা

একটি সাধারণ ওয়েব অ্যাপ্লিকেশনটিতে, কোনও ব্যবহারকারীকে প্রমাণীকরণ করতে ব্যবহৃত শংসাপত্রগুলি কেবল লগইন অনুরোধের সময় প্রেরণ করা হবে। যদি প্রমাণীকরণ সাফল্য পায় তবে ব্যবহারকারীর ব্রাউজারে একটি কুকি সেটের মাধ্যমে একটি সেশনটি স্থাপন ও রক্ষণাবেক্ষণ করা হবে।

পরবর্তী প্রতিটি অনুরোধে শংসাপত্রাদি থাকবে না, বরং সেশনটি চিহ্নিত করে এমন অনন্য কুকি থাকবে। লগইন সেশনগুলিকে সমর্থন করার জন্য, পাসপোর্টটি সেশন থেকে এবং ব্যবহারকারীদের দৃষ্টান্তগুলি সিরিয়ালাইজ করে এবং ডিসেসরিয়াল করবে।

এবং

নোট করুন যে সেশন সমর্থন সক্ষম করা পুরোপুরি optionচ্ছিক, যদিও এটি বেশিরভাগ অ্যাপ্লিকেশনের জন্য প্রস্তাবিত। সক্ষম করা থাকলে, লগইন সেশনটি সঠিক ক্রমে পুনরুদ্ধার করা হয়েছে তা নিশ্চিত করার জন্য পাসপোর্ট.অ্যাসিওশন () এর আগে এক্সপ্রেস.অ্যাসিওশন () ব্যবহারের বিষয়ে নিশ্চিত হন।


1
আপনার দ্রুত উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ তবে এটি আমার প্রশ্নের উত্তর দেয় না। এছাড়াও নোট করুন, আপনার এক্সপ্রেস অ্যাপ্লিকেশন থাকলে এবং আপনার এক্সপ্রেস সার্ভারের সাথে সংযোগকারী যে কোনও ক্লায়েন্টে (সে অনুমোদনপ্রাপ্ত কিনা) তার জন্য এক্সপ্রেস.অ্যাসিওশন () ব্যবহার করে, তাকে কুকির মাধ্যমে একটি অধিবেশন দেওয়া হবে। তিনি আপনার অ্যাপের লগইন সুরক্ষিত পৃষ্ঠায় আছেন কিনা সে বিষয়ে এটি স্বাধীন। আমি এখনও মিডলওয়্যার উভয়ের মধ্যে পার্থক্য জানতে চাই।
জর্জেস ক্রিংকার

1
@ জর্জেস ক্রিংকার এটি সিরিয়ালাইজ ব্যবহারকারী () এবং ডিসরিওলাইজ ব্যবহারকারী ব্যবহারকারী পদ্ধতি। এক্সপ্রেস মিডলওয়্যারটি সেশন তথ্য পুনরুদ্ধার করবে, তবে এটি পাসপোর্ট কীভাবে ব্যবহারকারীর তথ্য পরিচালনা করছে তার সাথে সম্পর্কিত নয়। এক্সপ্রেসের মাধ্যমে অধিবেশনটি পুনরায় হাইড্রেট করার পরে এটি করতে হবে।
জোশ সি

ওয়েল আমি এই ছাপের মধ্যে ছিলাম যে সিরিয়ালাইজ ইউজার () এবং ডিসিরিয়ালাইজার ব্যবহারকারী পদ্ধতিগুলি রুটগুলির মধ্যে প্রমাণীকরণ () এ চালিত।
জর্জেস ক্রিংকার

@ জর্জেস ক্রিংকার আমি যখন পাসপোর্ট ব্যবহার করি তখন আমি কেবল লগইনে .authenticate কল করি।
জোশ সি

app.post('/login', passport.authenticate('local'), ...
জোশ সি

11

আপনি যখন PassportJsআপনার লগইন ইউআরএল এর অংশ হিসাবে ব্যবহারকারীকে বৈধতা দেওয়ার জন্য ব্যবহার করবেন, তবুও আপনার এই ব্যবহারকারীর তথ্যটি সেশনে সংরক্ষণ করতে এবং পরবর্তী প্রতিটি অনুরোধের সাথে এটি পুনরুদ্ধার করার জন্য (যেমন ব্যবহারকারীকে সিরিয়ালাইজ / ডিসাইরিয়ালাইজ করা) দরকার some

সুতরাং কার্যকরভাবে, আপনি প্রতিটি অনুরোধের সাথে ব্যবহারকারীকে প্রমাণীকরণ করছেন, যদিও এই প্রমাণীকরণটির লগইন প্রতিক্রিয়া হিসাবে কোনও ডাটাবেস বা oথ অনুসন্ধান করা প্রয়োজন নয়। সুতরাং পাসপোর্টটি সেশন প্রমাণীকরণের সাথে আরও একটি প্রমাণীকরণ কৌশল হিসাবে বিবেচনা করবে।

এবং এই কৌশলটি ব্যবহার করার জন্য - যার নাম দেওয়া হয়েছে session, কেবল একটি সাধারণ শর্টকাট ব্যবহার করুন - app.use(passport.session())। এছাড়াও নোট করুন যে এই নির্দিষ্ট কৌশলটি আপনাকে সুস্পষ্ট কারণে ক্রিয়াকলাপটি কার্যকর করতে এবং ক্রিয়াকলাপটিকে deserialize করতে চায়।


11

এটি কেবল অধিবেশনটির অনুমোদন দেয় (যা জনসংখ্যাযুক্ত express.session())। এটি সমান:

passport.authenticate('session');

এখানে কোডে দেখা যাবে:

https://github.com/jaredhanson/passport/blob/42ff63c/lib/authenticator.js#L233


6
আপনি কি বোঝাতে চেয়েছেন? এটি প্রতিটি অনুরোধে চলছে এবং প্রমাণীকরণের জন্য কোনও শংসাপত্রের অগত্যা নেই। প্রতিটি অনুরোধে ঘটে যাওয়া ওয়ার্কফ্লো সম্পর্কে আমাকে আরও কিছু বিশদ দেওয়ার বিষয়ে আপনি কি আপত্তি করবেন?
জর্জেস ক্রিংকার

6
হ্যাঁ, প্রতিটি অনুরোধে এটি চালানো। এক্সপ্রেসের মাধ্যমে উত্পন্ন সেশন আইডি, একটি অনন্য আইডি যা ব্রাউজার প্রতিটি অনুরোধের সাথে প্রেরণ করে এমন একটি প্রমাণীকরণ টোকেনের সমান। এই সেশনে সংরক্ষিত ডেটা ব্যবহারকারীর প্রমাণীকরণের অবস্থা পুনরুদ্ধার করতে ব্যবহৃত হয়।
জারেড হ্যানসন

হ্যালো @JaredHanson আপনি কটাক্ষপাত করা গেল এই । আমি উত্তর কোথাও পাই না?
সরস আর্য

@ জ্যারেডহানসন আমি বহুল ব্যবহৃত ওপেন সোর্স অনুমোদনের সার্ভারের সাথে প্রমাণীকরণের জন্য পাসপোর্ট.জেএস ব্যবহার করার চেষ্টা করছি যা ওআউথ 2 অনুগামী। তবে আমি একটি ত্রুটি পাচ্ছি। আপনি কি সমস্যা সমাধানে সহায়তা করতে ইচ্ছুক? এখানে লিঙ্ক stackoverflow.com/questions/38176236/...
DollarCoffee

@ জ্যারেড হ্যানসন: আমি যেটা পর্যবেক্ষণ করছি তা হল, গুগল-ওউথের মাধ্যমে লগইন করার পরে পাসপোর্ট.ইউজারের তথ্য দিয়ে রেকর্ড অবজেক্টটি যুক্ত হয়েছে, যখন সাইটে নতুন পৃষ্ঠার জন্য পরবর্তী অনুরোধটি করা হবে তখন তা হারিয়ে যাবে। এই প্রত্যাশিত আচরণ? তারপরে আমি কীভাবে সম্প্রতি লগইন হওয়া ব্যবহারকারীর তথ্য ফিরে পেতে পারি তার ক্ষতি করছি?
ব্যবহারকারী1102171
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.