Как обрабатывать ошибки при создании новой стратегии аутентификации в node.js с использованием паспорта. js и JWT? - PullRequest
0 голосов
/ 26 марта 2020

я работаю над проектом node.js, в котором мне нужно реализовать аутентификацию на основе ролей для пользователей. Я реализовал простую стратегию аутентификации, и она работает нормально. Но когда я попытался реализовать стратегию аутентификации для normal users, чьи данные хранятся в коллекции CompanyContacts. получаю следующую ошибку.

Error: Unknown authentication strategy "user_rule"

Вот мой код:

tokenAuthentication. js:

const passport       = require("passport");
require('./passport');
module.exports = function (req, res, next) {

    passport.authenticate('jwt', function (err, user) {

        if(err) return res.status(500).json(err);
        if (!user) return res.status(401).json({"error":"You are not an authorized user!"});
        next();

    })(req, res, next);

};

module.exports.UserAuth = function(req, res, next){

    passport.authenticate('user_rule', function (error, user) {

        if (error) return res.status(500).json(err);
        if (!user) return res.status(401).json({"message":"No User found", "status":401, "success":false});
        next();

    })(req, res, next);

};

passport . js:

var passport = require("passport");
const CompanyContacts   = require('../models/CompanyContacts');\
const Users = require('../models/Users');
const dotenv = require("dotenv");
var {to}=require("../middlewares/utilservices");
var JwtStrategy = require('passport-jwt').Strategy;
var ExtractJwt = require('passport-jwt').ExtractJwt;
dotenv.config();

var opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = process.env.jwt_secret;


 passport.use(new JwtStrategy(opts, async function (jwt_payload, done) {

     let err, user;
     [err, user] = await to(CompanyContacts.findOne({'_id':jwt_payload._id}));
     if(err) return done(err, false);
     if(user) {
         return done(null, user);
     }else{
         return done(null, false);
     }
 }));


passport.use('user_rule',
    new JwtStrategy(opts,async function (payload, done) {
        console.log(payload)
        let err, authUser,companyResource;
        [err,authUser] = await to(Users.findOne({"_id":payload._id}).populate('company',
                                ["accountid","company_name","email","status"]).lean().exec());

        if (err) return done(err, false);
        if (!authUser) return done(null, false);

        let user= authUser;

        if(user.status==true && user.company.status==true){
        //     req.auth_user = {"_id":user._id,"email":user.email,"name":user.fullName,status:user.status};
        //     req.auth_company=user.company._id;
        //     req.isAdmin=false;  //Getting error here(req is undefined)
        //     req.auth_role=user.role;
            return done(null, user);
        }else{
            return done(err, false);
        }
    })
);

Я буду использовать эти стратегии, как в следующих маршрутах.

router.get('/get/user/data/:userId',tokenAuthentication.UserAuth, UserController.getUserById);

router.get('/get/all/users/data',tokenAuthentication, UserController.getAllUsers);

В приведенном выше коде файла passport.js я нужно возвращать данные закомментированного кода тоже. Но это дает ошибку,

(node:16856) UnhandledPromiseRejectionWarning: ReferenceError: req is not defined.

Как решить обе эти ошибки и есть ли другой способ решить эту проблему?

...