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


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.