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

时间:2018-03-05 13:36:33

标签: angularjs node.js mongodb express jwt

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

我在网上搜索过,但我似乎无法在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”的声明,我可以轻松地检查用户是否是管理员而无需访问数据库。

有人有任何建议吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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