我可以在同一个快速框架中将 Passport JWT 用于多个用户模式吗
Can I use Passport JWT for multiple user schema in a same express framework
我目前正在处理一个具有多个用户模式的项目,因为管理员、教师、学生都是具有不同结构的不同模式。结构很糟糕,但是所有的api都改不回来了。
所以问题出在这里,用户身份验证是由 passport 和 jwt 配置的。但它仅为教师配置。
const Teacher = require("../models/Teacher");
const User = require("../models/User");
const { SECRET } = require("../config");
const { Strategy, ExtractJwt } = require("passport-jwt");
const opts = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: SECRET
};
module.exports = passport => {
passport.use(
new Strategy(opts, async (payload, done) => {
await Teacher.findById(payload.user_id)
.then(user => {
if (user) {
return done(null, user);
}
return done(null, false);
})
.catch(err => {
return done(null, false);
});
})
);
};
但我也需要它用于其他两个模式。当我为其他人测试 api 时,我只是 await Teacher.findById(payload.user_id) 将 Teacher 更改为 User 并且它与 api 的 userAuth 一起工作,否则它未经授权正如预期的那样。请建议我一种方法,我可以同时将它应用于所有三个架构,而无需一次又一次地更改它。
您可以尝试类似的方法:
module.exports = passport => passport.use(
new Strategy(opts, async (payload, done) => {
try {
const teacher = await Teacher.findById(payload.user_id);
if(teacher) return done(null, teacher);
const user = await User.findById(payload.user_id);
if(user) return done(null, user);
const admin = await Admin.findById(payload.user_id);
if(admin) return done(null, admin);
return done(null, false);
}
catch(err) {
return done(null, false);
}
});
);
https://github.com/jaredhanson/passport/issues/50
这详细回答了问题。
我目前正在处理一个具有多个用户模式的项目,因为管理员、教师、学生都是具有不同结构的不同模式。结构很糟糕,但是所有的api都改不回来了。
所以问题出在这里,用户身份验证是由 passport 和 jwt 配置的。但它仅为教师配置。
const Teacher = require("../models/Teacher");
const User = require("../models/User");
const { SECRET } = require("../config");
const { Strategy, ExtractJwt } = require("passport-jwt");
const opts = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: SECRET
};
module.exports = passport => {
passport.use(
new Strategy(opts, async (payload, done) => {
await Teacher.findById(payload.user_id)
.then(user => {
if (user) {
return done(null, user);
}
return done(null, false);
})
.catch(err => {
return done(null, false);
});
})
);
};
但我也需要它用于其他两个模式。当我为其他人测试 api 时,我只是 await Teacher.findById(payload.user_id) 将 Teacher 更改为 User 并且它与 api 的 userAuth 一起工作,否则它未经授权正如预期的那样。请建议我一种方法,我可以同时将它应用于所有三个架构,而无需一次又一次地更改它。
您可以尝试类似的方法:
module.exports = passport => passport.use(
new Strategy(opts, async (payload, done) => {
try {
const teacher = await Teacher.findById(payload.user_id);
if(teacher) return done(null, teacher);
const user = await User.findById(payload.user_id);
if(user) return done(null, user);
const admin = await Admin.findById(payload.user_id);
if(admin) return done(null, admin);
return done(null, false);
}
catch(err) {
return done(null, false);
}
});
);
https://github.com/jaredhanson/passport/issues/50
这详细回答了问题。