Как закодировать аутентификацию по входу (паспорту) для двух разных типов пользователей? Node.js

#node.js #express #authentication #passport.js

#node.js #экспресс #аутентификация #passport.js

Вопрос:

Я новичок в Node.js .

Для моего приложения у меня есть два разных типа пользователей: врачи и пациенты. В настоящее время я кодирую логин и регистрацию для пациентов, и это работает. Я начинаю кодировать логин для врачей, и, похоже, он не работает. Ниже приведен passport.js . Я посмотрел видео (https://www.youtube.com/watch?v=6FOq4cUdH8kamp;ab_channel=TraversyMedia ), чтобы узнать, как закодировать логин и регистрацию.

Я думаю, что проблема в passport.js , Я не совсем уверен, как это закодировать, когда дело доходит до второго пользователя.

 const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcryptjs');

const Patient = require('../models/patients');

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
      Patient.findOne({
        email: email
      }).then(patient => {
        if (!patient) {
          return done(null, false, { message: 'That email is not registered' });
        }

        bcrypt.compare(password, patient.password, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, patient);
          } else {
            return done(null, false, { message: 'Password is incorrect' });
          }
        });
      });
    })
  );

  passport.serializeUser(function(patient, done) {
    done(null, patient.id);
  });

  passport.deserializeUser(function(id, done) {
    Patient.findById(id, function(err, patient) {
      done(err, patient);
    });
  });
  
const Doctor = require('../models/doctors');

module.exports = function(passport) {
  passport.use(
    new LocalStrategy({ usernameField: 'email' }, (demail, dpassword, done) => {
      Doctor.findOne({
        demail: demail
      }).then(doctor => {
        if (!doctor) {
          return done(null, false, { message: 'That email is not registered' });
        }

        bcrypt.compare(dpassword, doctor.dpassword, (err, isMatch) => {
          if (err) throw err;
          if (isMatch) {
            return done(null, doctor);
          } else {
            return done(null, false, { message: 'Password is incorrect' });
          }
        });
      });
    })
  );

  passport.serializeUser(function(doctor, done) {
    done(null, doctor.id);
  });

  passport.deserializeUser(function(id, done) {
    Doctor.findById(id, function(err, doctor) {
      done(err, doctor);
    });
  });
  
}}:
  

Это мой doctor.js в пути

 const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const passport = require('passport');

const Doctor = require('../models/doctors');

router.get('/doctorregister', (req, res) => res.render('Doctorregister'));

router.get('/doctorlogin', (req, res) => res.render('Doctorlogin'));

module.exports = router;


router.post('/doctorregister', (req, res) => {
    const { dname, dqualification, dlocation, dpractice, demail, dmobileno, dpassword, dpassword2 } = req.body;
    let errors = [];
  
    if (!dname|| !dqualification || !dlocation || !dpractice || !demail || !dmobileno  || !dpassword || !dpassword2) {
      errors.push({ msg: 'Please enter all fields' });
    }
  
    if (dpassword != dpassword2) {
      errors.push({ msg: 'Passwords do not match' });
    }
  
    if (dpassword.length < 6) {
      errors.push({ msg: 'Password must be at least 6 characters' });
    }
  
    if (errors.length > 0) {
      res.render('doctorregister', {
        errors,
        dname, 
        dqualification, 
        dlocation, 
        dpractice,
        demail, 
        dmobileno, 
        dpassword, 
        dpassword2
      });
    } else {
        Doctor.findOne({ demail: demail }).then(doctor => {
        if (doctor) {
          errors.push({ msg: 'Email already exists' });
          res.render('register', {
            errors,
            dname, 
            dqualification, 
            dlocation, 
            dpractice,
            demail, 
            dmobileno, 
            dpassword, 
            dpassword2
          });
        } else {
          const newDoctor = new Doctor({
            dname, 
            dqualification, 
            dlocation, 
            dpractice,
            demail, 
            dmobileno, 
            dpassword,
          });
  
         //hashing password in the database
         bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(newDoctor.dpassword, salt, (err, hash) => {
              if (err) throw err;
              newDoctor.dpassword = hash;
              newDoctor.save()
                .then(doctor => {
                  req.flash('success_msg', 'You are now registered and can log in')  
                  res.redirect('/doctors/doctorlogin');
                })
                .catch(err => console.log(err));
            });
          });
        }
      });
    }
});
 
router.post('/doctorlogin', (req,res, next) => {
  passport.authenticate('local', {
    successRedirect: '/doctordashboard',
    failureRedirect: '/doctors/doctorlogin',
    failureFlash: true
  })(req, res, next);
});

router.get('/logout', (req, res) => {
  req.logout();
  req.flash('You are logged out');
  res.redirect('/doctors/doctorlogin');
});
  

Комментарии:

1. Вам нужна только одна логика для входа в оба. Почему вы создаете две отдельные логики паспорта?

2. У вас должна быть только 1 пользовательская схема, а затем у вас может быть свойство, подобное type:Patient или type:Doctor , как сказал @AvivLo, вам нужна только 1 логика входа

3. хорошо, это потому, что я создал две схемы, одну для врача и одну для пациента, в моделях. Следовательно, почему я попытался создать две отдельные логики паспорта. Если бы я должен был сделать это только одной схемой пользователей, как бы их отличить, поскольку врачам требуется другая информация для регистрации по сравнению с пациентом. Мне очень жаль, если вопрос кажется действительно глупым, я действительно новичок в node.js.@ShivamSood

Ответ №1:

Два разных типа пользователей должны отличаться через схему пользователя, если вы используете mongoose и MongoDB в качестве использования Travesty-Media в некоторых своих видеороликах, а также через разрешения в разных разделах вашего веб-приложения.

Используйте тот же код паспорта, который вы использовали для пользователя patient, и это работает. Passport берет информацию о пользователе и превращает ее в токен аутентификации на предъявителя и отправляет его клиенту, а затем, когда он получает его от клиента, он декодирует его, чтобы узнать, какой пользователь входит в систему…

Разные пользователи имеют разную информацию, но одинаковую логику паспорта, даже если есть 2 разных пользователя-пациента. Таким образом, логика от пациента к врачу в отношении паспорта одинакова.

Если вы хотите, чтобы у пациента был доступ к разным маршрутам вашего приложения, вам нужно вставить промежуточное программное обеспечение в этот маршрут, чтобы проверить, совпадает ли тип пользователя с тем, который вы хотите, чтобы он был, но после того, как passport получит информацию из токена, который он получил со стороны клиента.

Комментарии:

1. Мне так нравится traversy media: D