如何使用 passport 和 passport-jwt 正确保护我的所有路线

how can I properly protect all my routes using passport and passport-jwt

我构建了这个 React 应用程序,并使用 passport-local 来验证管理员和用户的身份。我已经能够遵循一些教程并对用户进行身份验证。现在我想实现jwt来保护一些路由,我似乎没有让它起作用。使用 Postman,我可以注册,也可以登录,然后我会得到一个令牌。但是当我尝试受保护的路由时,我得到了 401 Unauthorized 响应。对此的任何帮助将不胜感激。

我已经能够按照一些教程对用户进行身份验证。现在我想实现jwt来保护一些路由,我似乎没有让它起作用。使用 Postman,我可以注册,也可以登录,然后我会得到一个令牌。但是当我尝试受保护的路由时,我得到了 401 Unauthorized 响应。对此的任何帮助将不胜感激。

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJWT = require('passport-jwt').ExtractJwt;
const config = require('./secret');

// const salt = bcrypt.genSaltSync(10);


module.exports = (userType, passport) => {
    const opts = {
        jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('JWT'),
        secretOrKey: config.secret,
    };

passport.use('jwt', new JwtStrategy(opts, (jwt_payload, done) => {
    try {
        User.findOne({
            where: {
                id: jwt_payload.id,
            },
        }).then(user => {
            if (user) {
                console.log('user found in db in passport');
                done(null, user);
            } else {
                console.log('user not found in db');
                done(null, false);
            }
        });
    } catch (err) {
        done(err);
    }
})
)

passport.use(
    'login',
    new LocalStrategy(
        {
            usernameField: 'username',
            passwordField: 'password',
            session: false,
        },
        (username, password, done) => {
            try {
                User.findOne({
                    where: {
                        username,
                    },
                }).then(user => {
                    if (user === null) {
                        return done(null, false, { message: 'bad username' });
                    }
                    bcrypt.compare(password, user.password).then(response => {
                        if (response !== true) {
                            console.log('passwords do not match');
                            return done(null, false, { message: 'passwords do not match' });
                        }
                        console.log('user found & authenticated');
                        return done(null, user);
                    });
                });
            } catch (err) {
                done(err);
            }
        },
    ),
);

这就是我试图保护路线的方式:

 router.get('/api/clients', (req, res, next) => {
passport.authenticate('jwt', { session: false }, (err, user, info) => {
    if (err) {
        console.log(err);
    }
    if (info !== undefined) {
        console.log(info.message);
        res.status(401).send(info.message);
    } else if (user.username === req.query.username) {
        User.findOne({
            where: {
                username: req.query.username,
            },
        }).then((userInfo) => {
            if (userInfo != null) {
                console.log('user found in db');
                res.status(200).send({
                    auth: true,
                    // first_name: userInfo.first_name,
                    // last_name: userInfo.last_name,
                    email: userInfo.email,
                    username: userInfo.username,
                    password: userInfo.password,
                    message: 'user found in db',
                });
                db.Client.findAll({}).then(function (dbClient) {
                    res.json(dbClient);
                });
            } else {
                console.error('no user exists in db with that username');
                res.status(401).send('no user exists in db with that username');
            }
        });
    } else {
        console.error('jwt id and username do not match');
        res.status(403).send('username and jwt token do not match');
    }
})(req, res, next);

});

我可以通过像这样简化受保护的路由来解决它:

 app.get('/auth/api/clients', 
passport.authenticate('jwt', {
session: false
  }), (req, res) => {

console.log(req.user);
// console.log(res)
return (db.Client.findAll({}).then(function 
(dbClient) {
  if (typeof dbClient === "object") {
    res.json(dbClient);
     }
   }
   ));
  });

现在一切正常。