Как аутентифицировать токены JWT с помощью Passport. js, созданных для нескольких ролей? - PullRequest
1 голос
/ 21 марта 2020

У меня есть вариант использования. Мое приложение имеет несколько пользователей, причем не все пользователи имеют доступ ко всем функциям приложения. Я должен ограничить их доступ к приложению. Для этого я пишу logi c, который работает как шлюз.

Я создал другой rules, который предоставляет другой тип методов аутентификации.

Когда пользователь входит в приложение, при успешном входе в систему генерируется токен JWT. Этот токен будет аутентифицирован с использованием данных правил.

Вот мой код.

сервер. js

global.app = new require("express")();
global.passport = require("passport");

require("./bin/kernal");
require('./bin/passport');
----Remaining Code----

TokenAuth . js

var passport = require("passport");
require("../../bin/passport");


module.exports= function (req, res, next) {
    passport.authenticate('jwt', function (error, user) {
        console.log(user);
        if (error) return next(error);
        if (!user) return res.status(401).json({"error":"Incorrect data", "status":401, "success":false});
        //req.user = user;
        next();

    })(req, res, next);
};
module.exports.UserAuth = function(req, res, next){ // Error Web Response
    passport.authenticate('user_rule', function (error, user) {

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

    })(req, res, next);
};

Паспорт. js

var passport = require("passport");

app.use(passport.initialize());
app.use(passport.session());

require('../app/middlewares/TokenAuth')

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

passport.deserializeUser(function (id, done) {
    User.findOne({_id: id}, function (err, user) {
        done(err, user);
    });
});

var JwtStrategy = require('passport-jwt').Strategy;
var ExtractJwt = require('passport-jwt').ExtractJwt;

var options = {};

options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = process.env.jwt_secret;

passport.use(new JwtStrategy(options, function (payload, done) {
    console.log(payload)
    User.findOne({_id: payload._id}, function (error, user) {

        if (error) return done(error, false);
        if (!user) return done(null, false);
        // req.auth_user = {"_id":user._id,"email":user.email,"name":user.name,"status":user.status}
        done(null, user);
    });
}));

passport.use('user_rule',    // UserAuth in TokenAuth.js has to use this functionality
    new JwtStrategy(options,async function (payload, done) {
        console.log(payload)
        let err, authUser,companyResource;
        [err,authUser] = await to(CompanyContacts.findById(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,isPrimary:user.primarycontact};
            req.auth_company=user.company._id;
            req.isAdmin=false;
            req.auth_role=user.role;
            done(null, user);
        }else{
            return done(err, false);
        }
    })
);

user_api. js

router.get("/all/menus",TokenAuth,MenuController.getAllDropDowns);
router.post("/company/user/signin", TokenAuth.UserAuth, AuthController.customerlogin);

Здесь, когда исполняется API post, только пользователь, прошедший аутентификацию, должен получить доступ к API.

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

{
    "error": "Incorrect data",
    "status": 401,
    "success": false
}

Насколько мне известно, данные не попадают в файл Passport.js для аутентификации.

Этот подход хорош, или мне нужно внести какие-либо изменения в этот код, чтобы он работал?

...