я работаю над проектом 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
.
Как решить обе эти ошибки и есть ли другой способ решить эту проблему?