网络安全.我能正确保护我的REST api吗?(node.js表示)

Ras*_*uls 5 security rest node.js jwt mean-stack

我有一个像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
});
Run Code Online (Sandbox Code Playgroud)

为了保护我的快速路线,我这样做:

在此示例中,它是"获取用户"路由,允许管理员获取有关任何给定用户的信息."普通"用户只能获得有关他/她自己的信息,为什么我将请求的用户名与从令牌解码的用户名进行比较.

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.' });
    }
})
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这有多安全?有人可以操纵会话令牌将用户名交换到别人的用户名吗?甚至将userType从用户更改为admin?

我的猜测是.只有他们知道"秘密"但是足够安全吗?毕竟秘密就像存储在代码中的纯文本密码一样.什么是最佳做法?

dan*_*y74 1

这是非常安全的,尤其是通过 HTTPS 发送时 - 那么攻击者不知道您的请求有效负载是什么样的。

唯一真正的危险是确保你的秘密安全,不要保存在公共 git 存储库上,锁定对存储秘密的任何盒子的访问。使用编码的秘密。

还有其他方法可以强化服务器。考虑使用 npm 流行的头盔模块。