在保护API中,可以通过验证当前用户来限制对资源的访问。以下是一种解决方法,包含代码示例:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// 定义本地策略
passport.use(new LocalStrategy(
function(username, password, done) {
// 在这里查询数据库或其他验证逻辑
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: '无效的用户名' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: '无效的密码' });
}
return done(null, user);
});
}
));
// 使用中间件验证用户身份
app.post('/login', passport.authenticate('local'), function(req, res) {
// 用户已经通过验证,可以生成和发送令牌
const token = generateToken(req.user);
res.json({ token: token });
});
const jwt = require('jsonwebtoken');
function generateToken(user) {
const payload = {
userId: user.id,
username: user.username
};
const secret = 'secretKey'; // 替换为你自己的密钥
const options = { expiresIn: '1h' }; // 可选的,设置令牌的过期时间
return jwt.sign(payload, secret, options);
}
const jwt = require('jsonwebtoken');
function authMiddleware(req, res, next) {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ message: '未提供令牌' });
}
const secret = 'secretKey'; // 替换为你自己的密钥
jwt.verify(token, secret, function(err, decoded) {
if (err) {
return res.status(403).json({ message: '令牌验证失败' });
}
req.user = decoded;
next();
});
}
// 在需要保护的路由上使用中间件
app.get('/protected', authMiddleware, function(req, res) {
// 只有经过验证的用户才能访问此路由
res.json({ message: '访问受保护的资源成功' });
});
使用上述方法,可以通过验证当前用户来保护API,并确保只有经过身份验证的用户能够访问受保护的资源。