Как использовать isValidUser () с passportjs - PullRequest
0 голосов
/ 20 апреля 2020

Мой логин работает и возвращается как успешный, когда я использую 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'});
  }

Оба они находятся в разных контроллерах в моем проекте

1 Ответ

0 голосов
/ 20 апреля 2020

похоже у вас нет этих сериализаторов из документации http://www.passportjs.org/docs/configure/

documentationpassport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});
...