我可以在同一个快速框架中将 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

这详细回答了问题。