पासपोर्ट.सेशन () मिडलवेयर क्या करता है?


125

मैं Easy Node Authentication: Setup और Local tutorial का उपयोग करके Passport.js का उपयोग करके एक प्रमाणीकरण प्रणाली का निर्माण कर रहा हूँ ।

मैं उलझन में हूं कि क्या passport.session()करता है।

विभिन्न मिडलवेयर के साथ खेलने के बाद मुझे समझ में आया कि express.session()वह क्या है जो क्लाइंट को कुकीज़ पर एक सत्र आईडी भेजता है, लेकिन मैं इसके बारे में उलझन में हूं passport.session()कि इसके अलावा क्या और क्यों आवश्यक है express.session()

यहाँ मैंने अपना आवेदन कैसे सेट किया है:

// Server.js एप्लिकेशन को कॉन्फ़िगर करता है और वेबसर्वर सेट करता है

//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() रीक ऑब्जेक्ट को बदलने और वर्तमान में सत्र आईडी (क्लाइंट कुकी से) सही deserialized उपयोगकर्ता ऑब्जेक्ट में 'उपयोगकर्ता' मान को बदलने के लिए एक मिडलवेयर के रूप में कार्य करता है।

जबकि अन्य उत्तर कुछ अच्छे बिंदु देते हैं, मुझे लगा कि कुछ और विशिष्ट विवरण प्रदान किए जा सकते हैं।

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;

जहां यह अनिवार्य रूप से एक मिडलवेयर के रूप में कार्य करता है और उपयोगकर्ता की वांछित पहचान रखने के लिए रीक ऑब्जेक्ट में 'उपयोगकर्ता' संपत्ति के मूल्य को बदल देता है। इसे सही ढंग से काम करने देने के लिए आपको अपने कस्टम कोड में शामिल 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()रीक ऑब्जेक्ट में 'यूजर' वैल्यू को बदल सके और अगले मिडलवेयर को पाइल में पास कर सके।


हे, मैं सत्र में केवल उपयोगकर्ता के विवरण को कैसे स्टोर कर सकता हूं, न ही मैं उन्हें डेटाबेस में स्टोर करना चाहता हूं
Newbiee

1
"अनुरोध हेडर में"? बस अनुरोध वस्तु में नहीं
caub

मैंने देखा है कि यदि सत्र की रणनीति उपयोगकर्ता को पुनर्स्थापित करने और उपयोगकर्ता को निष्क्रिय करने में सक्षम है। लेकिन इसके बावजूद कि प्रमाणीकरण अभी भी अगली रणनीति के लिए आगे बढ़ता है, जो मेरे परिदृश्य में फेसबुक पर है। मुझे आश्चर्य है कि सत्र की रणनीति का क्या मतलब है अगर यह अभी भी निम्नलिखित रणनीतियों को लागू करना जारी रखता है, भले ही सत्र उपयोगकर्ता को पुनर्प्राप्त करने में सक्षम हो।
निशांत

15

से प्रलेखन

कनेक्ट या एक्सप्रेस-आधारित एप्लिकेशन में पासपोर्ट आरंभ करने के लिए passport.initialize () मिडलवेयर की आवश्यकता होती है। यदि आपका एप्लिकेशन लगातार लॉगिन सत्रों का उपयोग करता है, तो passport.session () मिडलवेयर का भी उपयोग किया जाना चाहिए।

तथा

सत्र

एक विशिष्ट वेब एप्लिकेशन में, उपयोगकर्ता को प्रमाणित करने के लिए उपयोग किए जाने वाले क्रेडेंशियल केवल लॉगिन अनुरोध के दौरान प्रेषित किए जाएंगे। यदि प्रमाणीकरण सफल होता है, तो उपयोगकर्ता के ब्राउज़र में एक कुकी सेट के माध्यम से एक सत्र स्थापित और रखरखाव किया जाएगा।

प्रत्येक बाद के अनुरोध में क्रेडेंशियल्स शामिल नहीं होंगे, बल्कि सत्र को पहचानने वाली अनूठी कुकी। लॉगिन सत्रों का समर्थन करने के लिए, पासपोर्ट सत्र के दौरान और बाद में उपयोगकर्ता उदाहरणों को क्रमबद्ध और डिस्क्रिअलाइज़ करेगा।

तथा

ध्यान दें कि सत्र समर्थन को सक्षम करना पूरी तरह से वैकल्पिक है, हालांकि यह अधिकांश अनुप्रयोगों के लिए अनुशंसित है। यदि सक्षम किया गया है, तो यह सुनिश्चित करने के लिए कि पासपोर्ट (सेशन) से पहले एक्सप्रेस (सेशन) का उपयोग करना सुनिश्चित करें () यह सुनिश्चित करने के लिए कि लॉगिन सत्र को सही क्रम में बहाल किया गया है।


1
आपके त्वरित उत्तर के लिए धन्यवाद लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है। यह भी ध्यान दें कि यदि आपके पास एक एक्सप्रेस एप्लिकेशन है और किसी भी क्लाइंट पर एक्सप्रेस (सेशन) का उपयोग करें, जो आपके एक्सप्रेस सर्वर से जुड़ता है (वह प्रमाणित है या नहीं), तो उसे कुकी के माध्यम से एक सत्र दिया जाएगा। वह इस बात पर स्वतंत्र है कि वह आपके ऐप के लॉगिन संरक्षित पृष्ठ में है या नहीं। मैं अभी भी दोनों मिडलवेयर के बीच अंतर जानना चाहूंगा।
जार्ज क्रिंकर

1
@GeorgesKrinker यह serializeUser () और deserializeUser विधियाँ हैं। एक्सप्रेस मिडलवेयर सत्र जानकारी को पुनर्स्थापित करेगा, लेकिन यह आवश्यक नहीं है कि पासपोर्ट उपयोगकर्ता की जानकारी का प्रबंधन कैसे कर रहा है। उस सत्र के बाद एक्सप्रेस द्वारा निर्जलित किया जाना है।
जोश सी।

वैसे मैं इस धारणा के तहत था कि सीरीज़यूज़र () और डिसेरियलाइज़ यूज़र विधियाँ मार्गों के भीतर प्रमाणित () पर चलती थीं।
जार्ज क्रिंकर

@GeorgesKrinker मुझे ऐसा नहीं लगता। जब मैंने पासपोर्ट का इस्तेमाल किया, तो मैंने केवल लॉगिन पर .aententicate कहा।
जोश सी।

app.post('/login', passport.authenticate('local'), ...
जोश सी।

11

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

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

और इस रणनीति का उपयोग करने के लिए - जिसे नाम दिया गया है 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 क्या आप इस पर एक नज़र डाल सकते हैं । मुझे कहीं भी उत्तर नहीं मिला?
सरस आर्य

@JaredHanson मैं पासपोर्ट का उपयोग करने की कोशिश कर रहा हूं। एक व्यापक रूप से इस्तेमाल होने वाले ओपन सोर्स ऑथराइजेशन सर्वर के साथ प्रमाणित करने के लिए OAuth2 कंप्लेंट है। लेकिन मुझे एक त्रुटि मिल रही है। क्या आप समस्या को हल करने में मदद करने के लिए तैयार हैं? यहाँ लिंक है: stackoverflow.com/questions/38176236/…
डॉलरकॉफ़ी

@JaredHanson: मैं जो निरीक्षण करता हूं वह यह है कि google-oauth के माध्यम से लॉगिन करने के ठीक बाद passport.user जानकारी के साथ संवर्धित req ऑब्जेक्ट तब खो जाता है जब साइट पर एक नए पृष्ठ के लिए अगला अनुरोध किया जाता है। क्या यह अपेक्षित व्यवहार है? फिर मैं इस बात का नुकसान उठा रहा हूं कि उपयोगकर्ता जानकारी में हाल ही में लॉग इन कैसे करें?
14:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.