如何使用基于令牌的身份验证在Node.js中实现基于角色的授权?

时间:2018-11-18 18:30:55

标签: node.js rest express passport.js

我如何使用REST API方法(即基于令牌的身份验证)在教育公司(具有学生,家长和管理员三个角色)的nodejs中实现多种身份验证。

1 个答案:

答案 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);

您可以为每个角色创建一个新的中间件保护程序。