#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