作者:000000 | 来源:互联网 | 2023-01-01 12:03
我有一个像api一样的REST的MEAN堆栈应用程序.我有两种用户类型:用户和管理员.要签署用户并保持会话我使用jsonwebtoken jwt像这样(简化):
const jwt = require("jsonwebtoken");
//example user, normally compare pass, find user in db and return user
let user = { username: user.username, userType: user.userType };
const token = jwt.sign({ data: user }, secret, {
expiresIn: 604800 // 1 week
});
为了保护我的快速路线,我这样做:
在此示例中,它是"获取用户"路由,允许管理员获取有关任何给定用户的信息."普通"用户只能获得有关他/她自己的信息,为什么我将请求的用户名与从令牌解码的用户名进行比较.
let decodeToken = function (token) {
let decoded;
try {
decoded = jwt.verify(token, secret);
} catch (e) {
console.log(e);
}
return decoded;
}
// Get one user - admin full access, user self-access
router.get('/getUser/:username', (req, res, next) => {
let username = req.params.username;
if (req.headers.authorization) {
let token = req.headers.authorization.replace(/^Bearer\s/, '');
decoded = decodeToken(token);
if (decoded.data.userType == 'admin') {
//do something admin only
} else if (decoded.data.username == username) {
//do something user (self) only
} else{
res.json({ success: false, msg: 'not authorized' });
}
} else {
res.json({ success: false, msg: 'You are not logged in.' });
}
})
所以我的问题是,这有多安全?有人可以操纵会话令牌将用户名交换到别人的用户名吗?甚至将userType从用户更改为admin?
我的猜测是.只有他们知道"秘密"但是足够安全吗?毕竟秘密就像存储在代码中的纯文本密码一样.什么是最佳做法?