在MEAN堆栈应用程序中自定义JWT令牌的有效负载

问题描述 投票:0回答:2

在我的Web应用程序中,用户登录并创建令牌。现在我想添加对此令牌的有效负载的声明:作为管理员与否的布尔值。

我在网上搜索过,但我似乎无法找到如何在Mean堆栈应用程序中实现它。

我的目标是当用户登录时,我可以使用令牌的有效负载检查用户是否是管理员。然后我可以锁定我的应用程序的特定部分,以便只有管理员才能访问它们。

这是服务中的登录功能

function logIn(user) {
        return $http.post('/api/users/login', user, {
            headers: {
                Authorization: 'Bearer ' + getToken()
            }
        }).success(function(data) {
            saveToken(data.token);
        }).error(function(err){
          return err;
        });
    }

这些是保存令牌并从本地存储中获取令牌的功能:

function saveToken(token) {
        $window.localStorage['ptlab-app-token'] = token;
    }
function getToken() {
        return $window.localStorage['ptlab-app-token'];
    }

这是我用来检查用户是否登录以解锁应用程序的特定部分的功能:

function isLoggedIn() {
        var token = getToken();

        if (token) {
            var payload = angular.fromJson($window.atob(token.split('.')[1]));
            return payload.exp > Date.now() / 1000;
        } else {
            return false;
        }
    }

所以我想通过admin检查与isLoggedIn相同。但我似乎无法弄清楚如何自定义jwt令牌的有效负载并添加对有效负载的声明。通过名为“admin”的声明,我可以轻松地检查用户是否是管理员而无需访问数据库。

有人有什么建议吗?

angularjs node.js mongodb express jwt
2个回答
1
投票

你可以在创建令牌时调整令牌的有效负载(在Node.js中),这样你就可以简单地添加一个isAdmin布尔值。之后,您可以解码令牌并检索isAdmin的值,以查看用户是否是管理员。

令牌创建:

const payload = {
  id: user._id,
  isAdmin: user.isAdmin,
};
const token = jwt.sign(payload, "superSecret", {
  expiresIn: 86400,
});

令牌解码:

const decoded = await jwt.verify(token, "superSecret");
const isAdmin = decoded.isAdmin;

0
投票

您可以直接转到JWT.io解码您的令牌并找到内容,甚至您可以在令牌解码中发送isAdmin密钥和值,并在节点的客户端验证它是jwt.decode,在角应用程序中也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.