swagger api express中的用户和角色授权

时间:2016-09-14 15:31:10

标签: node.js express swagger-ui swagger-2.0

在我现有的api上我已经使用Bearer安全性进行了用户身份验证。使用http标头api_key和后来的标记。

我的问题似乎是我有不同的终点,只需要根据角色消费。

例如发布新用户:

POST user should only be authenticated to user with admin role.

我查看了APK splits但我没有找到关于他们的文档和谷歌的内容。

请给我一些脑力激荡的想法?以下是我在 nodejs和express中的访问验证码。

swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
  // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
  app.use(middleware.swaggerMetadata());

  app.use(middleware.swaggerSecurity({
    Bearer: function(req,def,apiKey,next){
        apiKey= apiKey.slice(7)
        debug("token check",def,apiKey)
        var ok=checkToken(apiKey)
        if(ok) {
          req.user=ok
          debug('Token is ok')
          return next()
        }
        debug("Invalid token",apiKey)
        var err=Error("Invalid token")
        err.statusCode=403
        next(err)
    }
  }));

1 个答案:

答案 0 :(得分:2)

在撰写本文时,解决方案仍然是自制的。 Swagger没有,通过oAuth范围或使用" hacky" api-key安全定义(https://stackoverflow.com/a/40222161/3736937),具有内置的RBAC机制。

幸运的是,我们可以创建一些非常基本的中间件来处理这个问题,因为swagger允许我们将x-swagger- *成员添加到swagger定义中。

所以这就是我所做的:

  1. 将x-swagger-roles添加到需要RBAC(基于角色的访问控制)的每个端点

    paths:
      "/":
        x-swagger-router-controller: getStatus
        get:
          operationId: getStatus
          x-swagger-roles:
            - admin
          tags:
            - "users"
          summary: "Returns message: 'working'"
          description: "default endpoint for testing"
          responses:
            $ref: "#/definitions/AnyResponse"
    
  2. 在向应用程序注册 swagger-node-runner之前放置中间件。在我们的例子中,我们使用了expressjs,因此使用了连接中间件。

    var findOne = function (haystack, arr) {
        return arr.some(function (v) {
            return haystack.indexOf(v) >= 0;
        });
    };
    
    app.use(function(req, res, next) {
      var operation = runner.getOperation(req);
      if(operation && operation.definition) {
        var definition = operation.definition;
        var requiredRoles = definition['x-swagger-roles'];
    
        // if the endpoint has no required roles then go to the next route
        if(!requiredRoles) return next();
    
        // get the users roles
        var userRoles = req.session.roles; // this may differ for you
    
        // if any roles match then go to the next route
        if(findOne(userRoles, requiredRoles)) return next();
    
        // if no roles match then assert that this endpoint is forbidden
        else return res.sendStatus(403);
      }
      next();
    })
    
    // it's important to register the middleware after the role check
    runner.expressMiddleware().register(app);
    
  3. 注意:

    1. 此代码尚未在生产中进行测试,应由安全专业人员审核。

    2. x-swagger-roles不会在没有改变的情况下出现在你的swagger-ui中,这超出了这个答案的范围。