我如何使用REST API方法(即基于令牌的身份验证)在教育公司(具有学生,家长和管理员三个角色)的nodejs中实现多种身份验证。
答案 0 :(得分:1)
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);
您可以为每个角色创建一个新的中间件保护程序。