Мой логин работает и возвращается как успешный, когда я использую passport.authenticate, однако, когда я использую функцию для действительного пользователя, я получаю ошибку «Несанкционированный запрос».
Функция рабочего регистра:
const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const Badgemodel = mongoose.model("Badges")
const router = express.Router();
const Hcpusermodel = mongoose.model("Hcpuser")
const {ObjectId} = require("mongodb");
var Hcpuser = require('../model/hcp.model')
router.post('/register', function (req, res, next) {
addToDB(req, res);
});
async function addToDB(req, res) {
var hcpuser = new Hcpuser({
email: req.body.email,
hcp : true,
username: req.body.username,
password: Hcpuser.hashPassword(req.body.password),
clinic: req.body.clinic,
creation_dt: Date.now()
});
try {
doc = await hcpuser.save();
return res.status(201).json(doc);
}
catch (err) {
return res.status(501).json(err);
}
}
Функция рабочего входа в систему с локальной стратегией:
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use('hcplocal', new LocalStrategy(
function(uemail, password, done) {
Hcpuser.findOne({ "email" : uemail }, function(err, user) { console.log(user)
if (err) { return done(err); }
if (!user) {
console.log(user);
console.log(err);
console.log(uemail)
return done(null, false, { message: 'Incorrect email.' });
}
if (!user.isValid(password)) {
console.log(user);
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
router.post('/login',function(req,res,next){
passport.authenticate('hcplocal', function(err, user, info) {
if (err) { return res.status(501).json(err); }
if (!user) { return res.status(501).json(info); }
req.logIn(user, function(err) {
if (err) { return res.status(501).json(err); }
console.log(user);
return res.status(200).json({message:'Login Success'});
});
})(req, res, next);
}
);
Проверка, которая не работает:
router.get('/user',isValidUser,function(req,res,next){
console.log(req.user._id);
return res.status(200).json(req.user);
});
router.get('/logout',isValidUser, function(req,res,next){
req.logout();
return res.status(200).json({message:'Logout Success'});
})
function isValidUser(req,res,next){
if(req.isAuthenticated()) next();
else return res.status(401).json({message:'Unauthorized Request'});
}
Я могу предоставить более подробную информацию, если это необходимо, но я застрял в том, почему это не работает, когда я использую его для другой коллекции в БД, и она работает нормально.
РЕДАКТИРОВАТЬ, так что это две стратегии, которые я пытается и в настоящее время ни один логин не работает.
Стратегия HCP:
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use('hcplocal', new LocalStrategy(
function(uemail, password, done) {
Hcpuser.findOne({ "email" : uemail }, function(err, user) { console.log(user)
if (err) { return done(err); }
if (!user) {
console.log(user);
console.log(err);
console.log(uemail)
return done(null, false, { message: 'Incorrect email.' });
}
if (!user.isValid(password)) {
console.log(user);
return done(null, false, { message: 'Incorrect password.' });
}
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(hid, done) {
Hcpuser.findById(hid, function(err, user) {
done(err, user);
});
});
return done(null, user);
});
}
));
router.post('/login',function(req,res,next){
passport.authenticate('hcplocal', function(err, user, info) {
if (err) { return res.status(501).json(err); }
if (!user) { return res.status(501).json(info); }
req.logIn(user, function(err) {
if (err) { return res.status(501).json(err); }
console.log(user);
return res.status(200).json({message:'Login Success'});
});
})(req, res, next);
});
router.get('/user',isValidUser,function(req,res,next){
console.log(req.user._id);
return res.status(200).json(req.user);
});
router.get('/logout',isValidUser, function(req,res,next){
req.logout();
req.session.destroy(function (err) {
if (!err) {
res.status(200).clearCookie().json({status: "Success"});
} else {
// handle error case...
}
});
return res.status(200).json({message:'Logout Success'});
})
function isValidUser(req,res,next){
if(req.isAuthenticated()) next();
else return res.status(401).json({message:'Unauthorized Request'});
}
Стратегия пользователя:
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use('userlocal', new LocalStrategy(
function(uemail, password, done) {
User.findOne({ "email" : uemail }, function(err, user) { console.log(user)
if (err) { return done(err); }
if (!user) {
console.log(user);
console.log(err);
console.log(uemail)
return done(null, false, { message: 'Incorrect email.' });
}
if (!user.isValid(password)) {
console.log(user);
return done(null, false, { message: 'Incorrect password.' });
}
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(hid, done) {
Hcpuser.findById(hid, function(err, user) {
done(err, user);
});
});
return done(null, user);
});
}
));
//login
router.post('/login',function(req,res,next){
passport.authenticate('userlocal', function(err, user, info) {
if (err) { return res.status(501).json(err); }
if (!user) { return res.status(501).json(info); }
req.logIn(user, function(err) {
if (err) { return res.status(501).json(err); }
return res.status(200).json({message:'Login Success'});
});
})(req, res, next);
});
router.get('/user',isValidUser,function(req,res,next){
console.log(req.user._id);
return res.status(200).json(req.user);
});
router.get('/logout',isValidUser, function(req,res,next){
req.logout();
return res.status(200).json({message:'Logout Success'});
})
function isValidUser(req,res,next){
if(req.isAuthenticated()) next();
else return res.status(401).json({message:'Unauthorized Request'});
}
Оба они находятся в разных контроллерах в моем проекте