首页 > 解决方案 > 如何使用为多个角色生成的 Passport.js 验证 JWT 令牌?

问题描述

我有一个用例。我的应用程序有多个用户,并非所有用户都可以访问应用程序中的所有功能。我必须限制他们访问应用程序。为此,我一直在编写用作网关的逻辑。

我创建了不同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);
};

Passport.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);

在这里,当postapi 被执行时,只有通过身份验证的用户才能获得该 api 的访问权限。

但这里的问题是,每当我使用这种身份验证方法时,我都会收到下面指定的错误。

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

据我所知,数据不会进入Passport.js文件进行身份验证。

这种方法好不好,还是我需要对此代码进行任何更改才能使其正常工作?

标签: javascriptnode.jsauthenticationjwtpassport.js

解决方案


推荐阅读