Angularjs 在平均堆栈应用程序中自定义JWT令牌的有效负载
在我的web应用程序中,用户登录并创建令牌。现在我想给这个令牌的负载添加一个声明:一个布尔值,表示是否是管理员 我在网上搜索过,但似乎找不到如何在平均堆栈应用程序中实现这一点 我的目标是,当用户登录时,我可以使用令牌的有效负载检查该用户是否是管理员。然后,我可以锁定我的应用程序的特定部分,这样它们只能由管理员访问 这是服务中的登录功能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, {
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上与本地/会话存储之间的问题时,我通常非常有偏见,因此我觉得有必要确保您从安全角度了解这些差异::干杯!