2015-03-17 5 views
30

मैं अपना पासपोर्ट स्थानीय रणनीति काम करने की कोशिश कर रहा हूं।पासपोर्ट का req.is प्रमाणीकृत हमेशा झूठी वापसी, यहां तक ​​कि जब मैंने हार्डकोड किया (शून्य, सत्य)

मैं इस मिडलवेयर सेट हो जाने पर:

passport.use(new LocalStrategy(function(username, password, done) { 
    //return done(null, user); 
    if (username=='ben' && password=='benny'){ 
     console.log("Password correct"); 
     return done(null, true); 
    } 
    else 
     return done(null, false, {message: "Incorrect Login"}); 
})); 

लेकिन फिर यहाँ में

app.use('/admin', adminIsLoggedIn, admin); 

function adminIsLoggedIn(req, res, next) { 

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) 
     return next(); 

    // if they aren't redirect them to the home page 
    res.redirect('/'); 
} 

यह हमेशा विफल रहता है और घर पृष्ठ पर रीडायरेक्ट।

मुझे नहीं पता कि यह क्यों हो रहा है? यह प्रमाणित क्यों नहीं होगा?

मेरे कंसोल में मैं देख सकता हूं कि Password Correct प्रिंटिंग है। यह क्यों काम नहीं करेगा?

उत्तर

35

मुझे एक समान समस्या थी। पासपोर्ट के लिए आवश्यक एक्सप्रेस-सत्र मिडलवेयर के कारण हो सकता है। इस क्रम में middlewares का उपयोग करके इसे फिक्स्ड: (एक्सप्रेस 4)

var session = require('express-session'); 

// required for passport session 
app.use(session({ 
    secret: 'secrettexthere', 
    saveUninitialized: true, 
    resave: true, 
    // using store session on MongoDB using express-session + connect 
    store: new MongoStore({ 
    url: config.urlMongo, 
    collection: 'sessions' 
    }) 
})); 

// Init passport authentication 
app.use(passport.initialize()); 
// persistent login sessions 
app.use(passport.session()); 
+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा है ... लेकिन समाधान प्राप्त करने में सक्षम नहीं है – Nodemon

+3

मैंने पहले ही जो कहा है, मैंने पहले ही किया है .. लेकिन अभी भी समस्या का सामना कर रहा है – Nodemon

+8

मेरी समस्या यह थी कि मैं 'passport.use, serializeUser, deserializeUser 'लेकिन मैं' app.use नहीं कह रहा था (passport.initialize()); ' और 'app.use (passport.session());' इससे पहले – osmingo

2

मैं पर

app.post('/login', 
    function(request, response, next) { 
     console.log(request.session) 
     passport.authenticate('login', 
     function(err, user, info) { 
      if(!user){ response.send(info.message);} 
      else{ 

       request.login(user, function(error) { 
        if (error) return next(error); 
        console.log("Request Login supossedly successful."); 
        return response.send('Login successful'); 
       }); 
       //response.send('Login successful'); 
      } 

     })(request, response, next); 
    } 
); 

उम्मीद है कि उस के लिए मदद कर सकता है

request.login() 

जोड़ने के लिए भूल से एक ही मुद्दा था दूसरों ने जो एक ही कारण यहां समाप्त किया जैसा मैंने किया था।

+0

passport.authenticaticate उपयोगकर्ता में झूठ और जानकारी खोने वाले प्रमाण पत्र के रूप में आ रही है। क्या आप गलती जान सकते हैं। कृपया स्पष्टीकरण के लिए मेरा प्रश्न देखें http://stackoverflow.com/questions/42898027/passport-js-local-strategy-custom-callback-showing-user-as-false-and-info-as-mi –

+0

@ ओई 1, धन्यवाद आप। तुमने मुझे बचाया। – Vikram

+2

नोट: passport.authenticate() midware req.login() स्वचालित रूप से आमंत्रित करता है। यह फ़ंक्शन मुख्य रूप से उपयोग किया जाता है जब उपयोगकर्ता साइन अप करते हैं, जिसके दौरान req.login() को नए पंजीकृत उपयोगकर्ता में स्वचालित रूप से लॉग इन करने के लिए बुलाया जा सकता है। – Epirocks

6

यह आपके ग्राहक के पोस्ट/जीईटी कॉल के साथ भी एक मुद्दा हो सकता है। मैं इस एक ही मुद्दा था, लेकिन यह पता चला कि मैं fetch देने के लिए था (जो मैं क्या उपयोग कर रहा था है) विकल्प credentials:'include' तो जैसे:

fetch('/...', { 
    method: 'POST', 
    headers: myHeaders, 
    credentials: 'include', 
    body: ... 
    ...}) 

कारण यह है कि लाने नीचे कुकीज़ गुजर समर्थन नहीं करता, जो इस मामले में आवश्यक है।

5
newbies

मैं एक ऐसी ही समस्या है, जहां मेरी isAuthenticated() फ़ंक्शन वापसी होगी false.I बहुत समय खो दिया सामना कर रहे थे के लिए

, इस सवाल का जवाब तुम्हारा बचाता है उम्मीद है।

के लिए बाहर देखने के लिए कुछ सामान्य समस्याओं,

  1. मिडिलवेयर सेटअप आदेश (व्यक्त सत्र> pass.initialize> pass.session) (और आपको लगता है कि जाँच आपकी वाक्य रचना करते हैं, जबकि)।
  2. सीरियलाइज और Deserialize विधियों को अनुरोध पर उपयोगकर्ता को पास करने की जरूरत है। (अधिक जानकारी के लिए मैंने इस लिंक पर एक उत्तर पोस्ट किया है .. Basics of Passport Session (expressjs)-why do we need to serialize and deserialize?) यदि अनुरोध पर कोई उपयोगकर्ता नहीं है तो प्रमाणीकृत गलत वापस आ जाएगा .... और रीडायरेक्ट करें पाथ परिभाषित ...... जब झूठा .... और ... फिर से ..... अपने SYNTAX की जांच करें।
  3. getUserById या findById समारोह मॉडल (user.js) में परिभाषित (User.findOne फिर से जांच अपने .. और नहीं IT..SYNTAX के लिए प्रतीक्षा) एक User.findById के लिए समारोह में परिभाषित की जरूरत है। (इस समारोह हर सत्र में अनुरोध पर उपयोगकर्ता को लोड होगा)
0

मैं अपने passport.deserializeUser फिक्सिंग करके इस समस्या को तय की।मैं मोंगो मूल का उपयोग कर रहा हूं और चूंकि अधिकांश उदाहरण मोंगोस का उपयोग करते हैं, मैं एक बार फिर से _id जाल में गिर गया।

तो _ id एक मोंगो ObjectID जब deserializeUser

passport.deserializeUser(function(user, done) { 
    const collection = db.get().collection('users') 
    const userId = new mongo.ObjectID(user); 
    collection.findOne({_id : userId}, function(err, user) { 
     if (err) done(err, null); 
     done(null, user); 
    }); 
}); 

के बाद से मैं आईडी एक ObjectID नहीं किया मेरे क्वेरी उपयोगकर्ता नहीं मिल रहा था, और कोई त्रुटि कहीं भी संकेत दिया गया था में उपयोगकर्ता पढ़ने बनाने के लिए याद ।

संबंधित मुद्दे