Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在平均堆栈应用程序中自定义JWT令牌的有效负载_Angularjs_Node.js_Mongodb_Express_Jwt - Fatal编程技术网

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

Angularjs 在平均堆栈应用程序中自定义JWT令牌的有效负载,angularjs,node.js,mongodb,express,jwt,Angularjs,Node.js,Mongodb,Express,Jwt,在我的web应用程序中,用户登录并创建令牌。现在我想给这个令牌的负载添加一个声明:一个布尔值,表示是否是管理员 我在网上搜索过,但似乎找不到如何在平均堆栈应用程序中实现这一点 我的目标是,当用户登录时,我可以使用令牌的有效负载检查该用户是否是管理员。然后,我可以锁定我的应用程序的特定部分,这样它们只能由管理员访问 这是服务中的登录功能 function logIn(user) { return $http.post('/api/users/login', user, {

在我的web应用程序中,用户登录并创建令牌。现在我想给这个令牌的负载添加一个声明:一个布尔值,表示是否是管理员

我在网上搜索过,但似乎找不到如何在平均堆栈应用程序中实现这一点

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

这是服务中的登录功能

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;
        }
    }
所以我想和isLoggedIn一样做一些管理检查。但我似乎不知道如何定制jwt令牌的负载并向负载添加声明。通过一个名为admin的声明,我可以轻松地检查用户是否是和admin,而无需访问数据库


有人有什么建议吗?

你可以简单地去JWT.io解码你的令牌并找到内容,甚至你可以在token decode中发送isAdmin密钥和值,并在客户端的node中验证它是否为JWT.decode,在angular application中是否相同。

你可以在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;

注意:在处理将JWT存储在Cookie上与本地/会话存储之间的问题时,我通常非常有偏见,因此我觉得有必要确保您从安全角度了解这些差异::干杯!