0

我正在使用passport-jwt来验证对express.js中给定路由的访问,然后将 Sequelize 模型返回给最终控制器。代码如下所示:

授权策略:

const passportStrategy = passport => {
    const options = {
        jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
        secretOrKey: config.auth.ACCESS_TOKEN_SECRET
    };

    passport.use(
        new Strategy(options, async (payload, done) => {
            try {
                const user = await User.findOne({ where: { email: payload.email }});
                if (user) {
                    return done(null, {
                        user
                    });
                }
                return done(null, false);
            }
            catch (error) {
                return done(error, false)
            }
        })
    );
};

带有 auth 中间件的路由

router.get('/:user_id/psy', passport.authenticate('jwt', { session: false }), patientsController.getPatientPsy);

控制器功能

const getPatientPsy = async (req, res) => {
    const authenticatedUser = req.user;

    if (authenticatedUser.userType !== "patient") {
       res.status(500).send("Big time error");
    }
}

如果我console.log(authenticatedUser)getPatientPsy()控制器中成功打印 Sequelize 模型及其dataValues等等,但是当我尝试访问任何属性时,无论是userType还是任何其他属性,它都会始终返回undefined

在passport-jwt身份验证中,一旦找到与提取的JWT令牌匹配的用户,afaik就会同步返回并使其在req.user对象中可用,我可以使用console.log打印它,但为什么不能我访问模型的属性?

我试图让getPatientPsy()控制器成为同步功能,但它也不起作用。

谢谢你。

4

1 回答 1

0

好吧,这很尴尬,默认情况下 Passport.js 在req.user属性中返回 done(null, user) ,因为我要返回{ user },所以我必须通过req.user.user访问。

于 2021-01-28T13:59:21.453 回答