要创建一条规则,只允许来自数据库的在线用户,我们需要考虑以下几个方面:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 假设我们有一个数据库模型来检查用户在线状态
const User = require('./models/User');
app.use(express.json());
// 登录端点
app.post('/login', async (req, res) => {
const { username, password } = req.body;
// 验证用户名和密码
const user = await User.findOne({ username, password });
if (user && user.online) {
const token = jwt.sign({ userId: user._id }, 'secret_key', { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).json({ message: 'Invalid credentials or user not online' });
}
});
// 受保护的端点
app.get('/protected', verifyToken, (req, res) => {
jwt.verify(req.token, 'secret_key', async (err, authData) => {
if (err) {
res.sendStatus(403);
} else {
const user = await User.findById(authData.userId);
if (user && user.online) {
res.json({ message: 'Access granted', user });
} else {
res.status(403).json({ message: 'User not online' });
}
}
});
});
// 中间件:验证令牌
function verifyToken(req, res, next) {
const bearerHeader = req.headers['authorization'];
if (typeof bearerHeader !== 'undefined') {
const bearerToken = bearerHeader.split(' ')[1];
req.token = bearerToken;
next();
} else {
res.sendStatus(403);
}
}
app.listen(3000, () => console.log('Server running on port 3000'));
问题:用户状态不同步。 原因:用户可能在多个设备上登录,导致状态不一致。 解决方法:使用全局会话管理或实时数据库更新用户在线状态。
问题:令牌泄露。 原因:客户端存储的令牌可能被窃取。 解决方法:使用HTTPS加密传输,定期更新令牌,实施严格的访问控制策略。
通过上述步骤和代码示例,可以有效地创建一条规则,只允许来自数据库的在线用户访问特定资源。
领取专属 10元无门槛券
手把手带您无忧上云