【问题标题】:How to implement role based authorization in Node.js using token based authentication?如何使用基于令牌的身份验证在 Node.js 中实现基于角色的授权?
【发布时间】:2020-02-08 01:21:49
【问题描述】:

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

【问题讨论】:

    标签: node.js rest express passport.js


    【解决方案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);
    

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

    【讨论】:

    • 我理解了这个概念,但无法理解执行此操作的语法。如何在生成令牌时附加有效负载。使用 token.verify() 方法验证令牌时检查角色的语法是什么。
    • 谢谢,凯。这比我预期的要多得多。我相信这会奏效。我已经有类似的中间件检查角色。现在语法对我来说非常清楚。太感谢了。我会发布任何进一步的查询。
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2020-05-23
    • 2021-03-25
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多