PassportJS का उपयोग करते हुए, स्थानीय प्रमाणीकरण रणनीति के लिए अतिरिक्त फॉर्म फ़ील्ड कैसे पास करता है?


98

मैं passportJS का उपयोग कर रहा हूं और मैं अपनी प्रमाणीकरण रणनीति (पासपोर्ट-स्थानीय) से अधिक req.body.usernameऔर केवल आपूर्ति करना चाहता हूं req.body.password

मैं 3 प्रपत्र फ़ील्ड्स है: username, password, औरfoo

मैं req.body.fooअपनी स्थानीय रणनीति से कैसे पहुँचा जाऊं जो दिखता है:

passport.use(new LocalStrategy(
  {usernameField: 'email'},
    function(email, password, done) {
      User.findOne({ email: email }, function(err, user) {
        if (err) { return done(err); }
        if (!user) {
          return done(null, false, { message: 'Unknown user' });
        }
        if (password != 1212) {
          return done(null, false, { message: 'Invalid password' });
        }
        console.log('I just wanna see foo! ' + req.body.foo); // this fails!
        return done(null, user, aToken);

      });
    }
));

मैं इसे अपने मार्ग के अंदर नहीं बुला रहा हूँ (मार्ग के मध्य के रूप में नहीं) जैसे:

  app.post('/api/auth', function(req, res, next) {
    passport.authenticate('local', {session:false}, function(err, user, token_record) {
      if (err) { return next(err) }
      res.json({access_token:token_record.access_token});
   })(req, res, next);

  });

जवाबों:


179

एक passReqToCallbackविकल्प है जिसे आप सक्षम कर सकते हैं, जैसे:

passport.use(new LocalStrategy(
  {usernameField: 'email', passReqToCallback: true},
  function(req, email, password, done) {
    // now you can check req.body.foo
  }
));

जब, सेट reqसत्यापित कॉलबैक के लिए पहला तर्क बन जाता है, और आप अपनी इच्छानुसार इसका निरीक्षण कर सकते हैं।


8
यह महान काम करता है, धन्यवाद। है passReqToCallbackगाइड में? मैंने इसे नहीं देखा।
2000 बजे k00k

2
अभी नहीं। मैं गाइड में नई सुविधाओं / विकल्पों को जोड़ने के लिए पीछे हूं।
जारेड हैन्सन

धन्यवाद, मुझे बहुत परेशानी से बचाया
बाइनरीगिएंट

9
यह बहु-किरायेदार / बहु-किरायेदारी प्रमाणीकरण को लागू करने के लिए वास्तव में उपयोगी है, लेकिन मेरी Google खोजों में नहीं आया। उम्मीद है कि मेरी टिप्पणी लोगों को भविष्य में इसका जवाब खोजने में मदद करेगी।
क्रिस डाहल

यह बहुत मददगार है। लेकिन क्या usernameFieldएक शर्त के अनुसार सेट करना संभव है ? मेरे पास दो विकल्प हैं: एक ईमेल है और दूसरा फोननंबर है। और लॉगिन तालिका में पासवर्ड के साथ ये दोनों फ़ील्ड शामिल हैं।
मैथ्यू जॉन

1

अधिकांश सामान्य मामलों में हमें लॉगिन के लिए 2 विकल्प प्रदान करने की आवश्यकता होती है

  • ईमेल के साथ
  • मोबाइल के साथ

इसका सरल, हम आम दायर उपयोगकर्ता नाम और क्वेरी $ या दो विकल्पों द्वारा ले सकते हैं, मैंने स्निपेट के बाद पोस्ट किया है, अगर कुछ एक ही सवाल है।

हम 'passReqToCallback' का भी उपयोग कर सकते हैं, यह सबसे अच्छा विकल्प है, धन्यवाद @Jared Hanson

passport.use(new LocalStrategy({
    usernameField: 'username', passReqToCallback: true
}, async (req, username, password, done) => {
    try {
        //find user with email or mobile
        const user = await Users.findOne({ $or: [{ email: username }, { mobile: username }] });

        //if not handle it
        if (!user) {
            return done(null, {
                status: false,
                message: "That e-mail address or mobile doesn't have an associated user account. Are you sure you've registered?"
            });
        }

        //match password
        const isMatch = await user.isValidPassword(password);
        debugger
        if (!isMatch) {
            return done(null, {
                status: false,
                message: "Invalid username and password."
            })
        }

        //otherwise return user
        done(null, {
            status: true,
            data: user
        });
    } catch (error) {
        done(error, {
            status: false,
            message: error
        });
    }
}));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.