-1

我目前正在开发一个具有多个用户模式的项目,因为管理员、教师、学生都是具有不同结构的不同模式。结构很糟糕,但是所有的api都不能真正改回来。

所以问题是这里的用户身份验证是由护照和 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 时,我只需等待 Teacher.findById(payload.user_id) 将 Teacher 更改为 User 并且它与 api 的 userAuth 一起使用,否则它会按预期未经授权。请建议我一种方法,我可以同时将它应用于所有三个模式,而无需一次又一次地更改它。

4

2 回答 2

0

您可以尝试以下方法:

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);
    }
  });
);
于 2020-07-31T23:41:47.490 回答
0

https://github.com/jaredhanson/passport/issues/50

这详细回答了这个问题。

于 2020-08-01T03:29:23.573 回答