如何使用 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);
}
}
));
});
现在一切正常。
我构建了这个 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);
}
}
));
});
现在一切正常。