javascript - 如何使用为多个角色生成的 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);
在这里,当post
api 被执行时,只有通过身份验证的用户才能获得该 api 的访问权限。
但这里的问题是,每当我使用这种身份验证方法时,我都会收到下面指定的错误。
{
"error": "Incorrect data",
"status": 401,
"success": false
}
据我所知,数据不会进入Passport.js
文件进行身份验证。
这种方法好不好,还是我需要对此代码进行任何更改才能使其正常工作?
解决方案
推荐阅读
- list - Python TypeError: 'tuple' object is not callable 我正在尝试遍历 len(list) 但它给了我这个错误
- javascript - D3 总是合并节点,即使是相同的数据
- jquery - 验证旧值隐藏输入 - laravel
- c - 在 Xcode 中编译 x86_64 程序集
- python - 根据样本大小和标签的比例将数据帧拆分为多个
- python - 在 Python Quart 中获取请求参数
- html - 整页视频背景
- python - 在 Python 中打印列表的特定排列
- ios - 从 UICollectionViewCell 访问保存在 UIViewController 中的变量?
- awk - 如何使用 awk 在最后一个字段之前将字段添加到文本文件中?