【问题标题】:Integrating passport middleware in swagger nodejs restful app?在 swagger nodejs restful 应用程序中集成护照中间件?
【发布时间】:2016-11-10 00:18:12
【问题描述】:

最近开始为 nodejs express 应用探索 swagger。 据我了解,swagger 是一种框架,需要在 nodejs express 应用程序中遵循约定。 Swagger 使用控制器自动映射路线。

但我觉得,我失去了注入中间件(如护照)进行身份验证的能力,可以很容易地添加到用户定义的路由中。

我知道有办法用 swagger 注入中间件,但不知何故我觉得它不像没有 swagger 那样自然。

有没有一种方法可以在我的代码中使用带有最少 swagger 相关组件的 swagger - 可能只使用 swagger.yaml 文件?

我想避免使用 req.swagger.param 类型的代码,并希望利用标准方法来定义路由和注入中间件。

【问题讨论】:

    标签: node.js express swagger passport.js


    【解决方案1】:

    Swagger 本身就是一个中间件。当您启动应用程序时,swagger 将使用 app.Use([swaggerMiddlewareObject]) 注册自己。因此,您可以在 swagger 之前/之后添加其他中间件。

    请在下面找到评论部分。您必须根据您的身份验证策略对其进行更改。

    'use strict';
    
    var SwaggerExpress = require('swagger-express-mw');
    var app = require('express')();
    var passport = require('passport');
    
    module.exports = app; // for testing
    
    var config = {
      appRoot: __dirname // required config
    };
    
    /*Mount your passport Middleware here using app object. As your are building a stateless restful api, I assume you would use jwt
    * 1. import jwt-strategy.
    * 2. Configure passport to use jwt strategy.
    * 3. app.use(passport.initialize());
    * 4. app.use('/pathYouWantProtect', passport.authenticate('jwt-strategy'),function(req,res,next){
    *       
    *    });
    */
    
    SwaggerExpress.create(config, function(err, swaggerExpress) {
      if (err) { throw err; }
    
      // install middleware
      swaggerExpress.register(app);
    
      var port = process.env.PORT || 10010;
      app.listen(port);
    
      if (swaggerExpress.runner.swagger.paths['/hello']) {
        console.log('try this:\ncurl http://127.0.0.1:' + port + '/hello?name=Scott');
      }
    });
    

    【讨论】:

    • 我必须删除 function() 回调才能使其正常工作,否则它会覆盖路径的另一条路由:app.get("/api/v1/users", passport.authenticate("jwt", { session: false }));
    【解决方案2】:

    我的解决方案。需要定义一个中间件

      ./middleware/passport
    
      export.swaggerPassport = function(passport) {
        const applyPassport = passportService(passport);
        return function(controller) {
           const action = async (req, res, next) => {
              const [err, user] = await applyPassport(req, res, next);
              if (err) {
                return errorResponse(res, err, 422);
              }
              controller.action(req, res, next);
           };
           return { spec: controller.spec, action };
         }
      };
    
     ../services/util.service
    
    exports.swaggerPassport = function(passport) {
      const applyPassport = passportService(passport);
      return function(controller) {
        const action = async (req, res, next) => {
          const [err, user] = await applyPassport(req, res, next);
            if (err) {
              return errorResponse(res, err, 422);
            }
            controller.action(req, res, next);
        };
        return { spec: controller.spec, action };
      }
    };
    

    然后把护照交给那里

    server.js
    
    const { passportStrategy, swaggerPassport } = require('./middleware/passport');
    passportStrategy(passport);
    const routePassport = swaggerPassport(passport);
    

    当我们需要保护控制器动作时调用

    swagger.addGet(routePassport(api.Dashboard.dashboard))
    

    github 中提供的所有代码

    【讨论】:

      猜你喜欢
      • 2016-05-18
      • 2020-10-24
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2018-09-30
      • 2016-02-20
      相关资源
      最近更新 更多