我如何添加一个简单的中间件来验证JWT并确保其获得授权



我有以下中间件,可用于JWT和passport.js的身份验证。问题是,我还需要以某种方式验证所有控制器的用户是否为管理员。我使用这个passport.js中间件进行身份验证:

if (typeof app == "function") {
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser(function (user, done) {

done(null, JSON.stringify(user));
});
passport.deserializeUser(function (user, done) {

done(null, JSON.parse(user));
});
var opts = {};
opts.jwtFromRequest = passportJwtExctract.fromAuthHeaderAsBearerToken();
opts.secretOrKey = process.env.JWT_SECRET;
passport.use(
new passportJwtStrategy(opts, async (jwt_payload, done) => {
var user = await User.findByPk(jwt_payload.id);
if (user === null) {
return done(null, false, {
message: "Sorry, we couldn't find an account.",
});
}
done(null, user);
await User.update(
{ last_signin_date: "now()" },
{
where: {
id: user.id,
},
}
);
return;
})
);
passport.use(
new passportLocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
function (username, password, done) {
process.nextTick(async function () {
var valid =
validator.isEmail(username) && validator.isLength(password, 8);
if (!valid) {
return done(null, false, {
message: "Incorrect username or password",
});
}
username = username.toLowerCase();
let user = await User.findOne({ where: { email: username } });
user = user.toJSON();
if (user === undefined) {
return done(null, false, {
message: "Sorry, we couldn't find an account with that email.",
});
}
var hashed_password = await bcrypt.hash(password, user.salt);
if (hashed_password == user.password) {
delete user.password;
delete user.salt;
user.user_mode = process.env.USER_MODE;
user.token = jwtLib.sign(user, process.env.JWT_SECRET);
//l('done user', user)
done(null, user);
await User.update(
{ last_signin_date: "now()" },
{
where: {
id: user.id,
},
}
);
return;
}
return done(null, false, {
message: "Sorry, that password isn't right.",
});
});
}
)
);
}

我如何正确验证JWT的所有相关请求,并确保用户是管理员?有点像下面的选项。

Common.ensureAuthenticated("Administrator"),

您可以研究Outh2身份验证,在JWT令牌中,您可以根据需要声明参数的数量,在验证时,您可以验证它,并提取并在任何您想要的地方使用它!

对于管理员和不同的角色,您可以定义";演员;作为键及其角色的优先级作为值,并在运行时创建一个checkactor标志!

我假设您的应用程序从index.js启动。在index.js中,您可以在启动路由之前使用中间件。

例如:

const express = require('express');
const app = express();
const router = require('./src/router'); // Your router file (router.js)
app.use(AuthMiddleware); // This is how you use your middleware
app.use('/', router);

最新更新