পাসপোর্টজেএস ব্যবহার করে, কীভাবে একজন স্থানীয় প্রমাণীকরণ কৌশলটিতে অতিরিক্ত ফর্ম ক্ষেত্রগুলি পাস করে?


99

আমি পাসপোর্টজেএস ব্যবহার করছি এবং আমি কেবলমাত্র 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);

  });

উত্তর:


183

এমন একটি passReqToCallbackবিকল্প রয়েছে যা আপনি সক্ষম করতে পারবেন, এর মতো:

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

কখন, সেটটি reqযাচাই করা কলব্যাকের প্রথম যুক্তিতে পরিণত হয় এবং আপনি ইচ্ছামত এটি পরিদর্শন করতে পারেন।


8
ধন্যবাদ এটি দুর্দান্ত কাজ করে। কি passReqToCallbackগাইডে? আমি তা দেখিনি।
k00k

4
এখনো না. আমি গাইডে নতুন বৈশিষ্ট্য / বিকল্প যুক্ত করার পিছনে আছি।
জ্যারেড হ্যানসন

ধন্যবাদ, আমাকে অনেক সমস্যা বাঁচিয়েছে
বাইনারিজিয়ান্ট

9
এটি বহু-ভাড়াটে / বহু-প্রজাস্বত্ব প্রমাণীকরণ বাস্তবায়নের জন্য সত্যই সহায়ক, তবে আমার গুগল অনুসন্ধানে আসে নি। আশা করি আমার মন্তব্য ভবিষ্যতে এই উত্তর খুঁজে পেতে লোকদের সহায়তা করবে।
ক্রিস দহল

এটি খুব সহায়ক। তবে usernameFieldশর্ত অনুযায়ী সেট করা কি সম্ভব ? আমার দুটি বিকল্প রয়েছে: একটি ইমেল এবং অন্যটি ফোনেম্বার। এবং লগইন সারণীতে পাসওয়ার্ড সহ এই দুটি ক্ষেত্র রয়েছে।
ম্যাথিউ জন

1

বেশিরভাগ সাধারণ ক্ষেত্রে আমাদের লগইনের জন্য 2 টি বিকল্প সরবরাহ করতে হবে

  • ইমেল সহ
  • মোবাইল সহ

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

আমরা 'পাসেরেকটোক্যালব্যাক'ও সেরা বিকল্প হিসাবে ব্যবহার করতে পারি, ধন্যবাদ @ জ্যারেড হ্যানসন

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
        });
    }
}));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.