【发布时间】:2020-02-08 01:21:49
【问题描述】:
如何使用 REST API 方法(即基于令牌的身份验证)在 nodejs 中为一家教育公司实现多个身份验证,具有三个角色 - 学生、家长和管理员。
【问题讨论】:
标签: node.js rest express passport.js
如何使用 REST API 方法(即基于令牌的身份验证)在 nodejs 中为一家教育公司实现多个身份验证,具有三个角色 - 学生、家长和管理员。
【问题讨论】:
标签: node.js rest express passport.js
0。概念
一个 JWT 令牌 (https://jwt.io/),包含一个 payload,在此有效负载中,您可以指定一个自定义 role 对象。在角色对象中,您可以设置布尔值来确定角色是学生、家长还是管理员。
负载示例
{
...
"role": {
student: true,
parent: false,
admin: false,
}
}
当您为特定用户生成令牌时,请将有效负载详细信息附加到令牌。 (当然,您可以根据您希望用户是学生、家长还是管理员来调整有效负载详细信息)。
当用户将来使用他们的令牌发出请求时,您可以进行回调以检查他们的令牌并查看payload.role 对象以查看用户的角色,然后决定他们是否是是否有权执行特定操作。
1.生成令牌
有关生成令牌的更多信息,请参阅https://www.npmjs.com/package/jsonwebtoken。
const payload = {
userid: 123,
role: {
student: false,
parent: false,
admin: true,
},
};
const signOptions = {
issuer: this.config.jwt.issuer,
subject: payload.userid,
audience: this.config.jwt.audience,
expiresIn: "730d",
algorithm: "RS256",
};
const token = jwt.sign(payload, this.config.jwt.privateKey.replace(/\\n/g, "\n"), signOptions);
2。检查角色的中间件
如果您正在使用带有 JWT 身份验证的护照,您应该已经拥有类似的东西。
const authGuard = PassportMiddleware.authenticate("jwt", { session: false });
router.get("/admin", authGuard, controller.index);
我们需要一个新的中间件来处理角色检查。我们将此中间件称为adminGuard。使用authGuard 中间件进行身份验证后,req 对象将包含一个用户(即 jwt 有效负载)。现在我们有了用户信息,我们可以检查他们的角色。
const adminGuard = (req, res, next) => {
if(req.user && !req.user.role.admin) {
next(new Error('You are not an admin'));
} else {
next();
}
}
router.get("/admin", authGuard, adminGuard, controller.index);
您可以为每个角色创建一个新的中间件保护。
【讨论】: