passport.js passport.initialize () मिडलवेयर उपयोग में नहीं है


103

मैं एक्सप्रेस + मोंगोज़ के साथ नोड का उपयोग कर रहा हूं और आरामदायक एपीआई के साथ पासपोर्ट का उपयोग करने की कोशिश कर रहा हूं।
प्रमाणीकरण की सफलता के बाद मुझे यह अपवाद मिलता रहा (मुझे ब्राउज़र पर कॉलबैक url दिखाई दिया):

/Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/utils.js:419
        throw err;
              ^
Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/http/request.js:30:30)
    at Context.module.exports.delegate.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/middleware/authenticate.js:194:13)
    at Context.actions.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/context/http/actions.js:21:25)
    at verified (/Users/naorye/dev/naorye/myproj/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:133:18)
    at Promise.module.exports.passport.use.GitHubStrategy.clientID (/Users/naorye/dev/naorye/myproj/config/passport.js:91:24)
    at Promise.onResolve (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8)
    at Promise.EventEmitter.emit (events.js:96:17)
    at Promise.emit (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38)
    at Promise.fulfill (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20)
    at /Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/query.js:1822:13

मैंने पढ़ा है कि मुझे लगाना चाहिए app.use(passport.initialize());और app.use(passport.session());इससे पहले app.use(app.router);कि मैंने ऐसा किया। यहाँ मेरा व्यक्त है। मध्यवर्ग को पंजीकृत करने वाली जातियां:

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {
        // use passport session
        app.use(passport.initialize());
        app.use(passport.session());

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

गलत क्या है?

अद्यतन @Peter लायंस के अनुसार मैंने विन्यास क्रम को निम्नलिखित में बदल दिया है, लेकिन मुझे अभी भी वही त्रुटि मिली है:

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

        // use passport session
        app.use(passport.initialize());
        app.use(passport.session());

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

एक्सप्रेस 4.x संस्करण कुछ विधियों का समर्थन नहीं करते हैं। देखें github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
miksiii

जवाबों:


206

आउट-ऑफ-द-ऑर्डर मिडलवेयर नरक से बचने के लिए उदाहरण का पालन करें जो एक्सप्रेस को दर्ज करना इतना आसान बनाता है। डॉक्स से सीधे। ध्यान दें कि कैसे आपका यह बिल्कुल मेल नहीं खाता है।

var app = express();
app.use(require('serve-static')(__dirname + '/../../public'));
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

डॉक्स

  1. cookieParser
  2. अधिवेशन
  3. passport.initialize
  4. passport.session
  5. app.router

आप

  1. passport.initialize
  2. passport.session
  3. cookieParser
  4. अधिवेशन
  5. app.router

मैंने इसे आपके सुझाव के अनुसार बदल दिया है, लेकिन यह अभी भी इस त्रुटि को फेंकता है। मैंने नई एक्सप्रेस के साथ अपने सवाल को अपडेट किया। जेएस फाइल /
नोर

7
इसलिए आपके पास यहां मौजूद कोड आपका शीर्ष-स्तरीय कोड नहीं है। अपने कार्यक्रम की शुरुआत में आप के लिए किसी भी कॉल कर रहे हैं app.get, app.post, आदि? उन राउटर के कारण आप पहले से ही स्टैक में जुड़ जाएंगे। जब आप express()फ़ंक्शन को अपनी appवस्तु प्राप्त करने के लिए आमंत्रित करते हैं, तो हमें सभी प्रारंभिक कोड दिखाएं । यह मेरा दूसरा अनुमान है।
पीटर ल्योन

3
मैंने देखा है कि app.use (app.router); पासपोर्ट इनिशियलाइज़ के बाद कॉल किया जाता है, लेकिन मैं कहता हूं: ('./ config / मार्गों') की आवश्यकता होती है (ऐप, पासपोर्ट, ऑर्थर); कॉन्फ़िगरेशन को व्यक्त करने के लिए कॉल करने से पहले। दोनों लाइनों के बीच स्विच करने से समस्या हल हो गई। धन्यवाद!
नौर

1
यह मेरे लिए काम किया! लेकिन मिडलवेयर को ऐसा क्यों करना पड़ता है?
एंथनी

3
डिजाइन के आधार पर आप किए जा रहे पूर्वापेक्षाओं पर भरोसा कर सकते हैं। यदि कुकी अभी तक कुकीज़ को पार्स नहीं किया है तो सत्र काम नहीं करेगा।
पीटर ल्योन

12

मेरे मामले में (एक ही त्रुटि संदेश) मैं पासपोर्ट की आरंभीकरण जोड़ना भूल गया हूँ:

app.configure(function () {
    ...
    app.use(passport.initialize());
    app.use(passport.session());
});

अद्यतन: केवल संस्करण 3 को व्यक्त करने के लिए काम कर रहा है, संस्करण 4 अब app.configure () का समर्थन नहीं करता है


1
App.configure किसी भी अधिक इस्तेमाल नहीं किया जा सकता है। github.com/strongloop/express/wiki/… .. उन्हें पासपोर्ट डॉक्स को अपडेट करना चाहिए। सही?
जैक खाली

9

मेरे मामले में त्रुटि क्योंकि था मैं promisify करने की कोशिश कर रहा था req.loginबंधन के बिना thisकरने के लिए reqहै, इसलिए जब समारोह कहा जाता था यह नहीं मिल सकाpassport सेटिंग्स। यदि आप नोड v8 का उपयोग कर रहे हैं, तो req.login.bind(req)इसे पास करने से पहले समाधान बाध्यकारी है promisify


और यह "स्कोप इश्यू" उदाहरण के लिए होता है जब आप पहले तर्क को function({ login })पारित करने की तरह विनाशकारी तर्कों का उपयोग करते हैं req। आपके समाधान ने मेरे लिए काम किया, धन्यवाद
मैनुअल डि इयोरियो

हाँ, यह कैसे thisजावास्क्रिप्ट में काम करता है। आप वस्तु विधि के रूप में फ़ंक्शन को कॉल नहीं है, तो thisहो सकता है undefined(या windowब्राउज़र में)
Jiayi हू

किसी को भी इस उत्तर को पढ़ने और इसे समझने के लिए युक्ति ... यदि आप जांच करते हैं Function.prototype.call, Function.prototype.applyकि thisजावास्क्रिप्ट में कैसे काम करता है और प्रोटोटाइपिक वंशानुक्रम के पीछे के सिद्धांत, आप प्रक्रिया में जावास्क्रिप्ट गुरु के स्तर को बढ़ावा देंगे :)
Stijn de Witt

चीयर्स, मुझे उम्मीद थी यह उतना ही आसान के रूप में होगाutil.promisify(req.login.bind(req));
जूलियन एच लाम

4

क्या मदद मिली है मुझे भी डाल करने के लिए था मार्गों के बाद कुकीज़ config:

// init Cookies:
app.use(
    cookieSession({
        maxAge: 30 * 24 * 60 * 60 * 1000,
        keys: [keys.cookieKey]
    })
);
app.use(passport.initialize());
app.use(passport.session());

// init routes
const authRoutes = require("./routes/authRoutes")(app);

किसी भी विचार है कि विन्यास काम करने के बाद क्यों init मार्ग है?
इशु

इससे मेरा मुद्दा ठीक हो गया। मैंने सभी मार्गों को स्थानांतरित कर दिया था। पासपोर्ट से संबंधित किसी भी चीज़ के बाद कॉल करें।
निक वान ब्रंट

2

पीटर लियोन जवाब ने मुझे इसे हल करने में मदद की, लेकिन मैंने इसे अलग तरीके से हल किया।

app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey],
  }),
);
app.use(passport.initialize());
app.use(passport.session());

पूरे कोड के लिए मेरे GitHub रेपो पर एक नज़र डालें और न केवल यहां कोड स्निपेट देखें।


1

मेरे मामले में (एक ही त्रुटि संदेश), मैं एक कस्टम रणनीति विकसित कर रहा था और मुझे एक सत्र का उपयोग करने की आवश्यकता नहीं है । मैं session: falseअपने मार्ग के बीच में जोड़ना भूल गया authenticate

  app.post('/api/public/auth/google-token',
    passport.authenticate('google-token', {
      session: false
    }),
    function (req: any, res) {
      res.send("hello");
    }
  );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.