在swagger nodejs restful app中集成护照中间件?

时间:2016-07-07 15:30:29

标签: node.js express swagger passport.js

最近开始为nodejs express app探索swagger。 据我所知,swagger是一种框架,需要在nodejs express app中遵循约定。 Swagger通过控制器自动映射路径。

但我觉得,我没有注入像护照这样的中间件进行身份验证的功能,可以很容易地在用户定义的路由中添加。

我知道有很多方法可以轻率地注入中间件,但不知怎的,我觉得它并不像没有招摇的那样自然。

我的代码中是否有一种方法可以使用swagger和最小的swagger相关组件 - 可能仅使用swagger.yaml文件?

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

2 个答案:

答案 0 :(得分:5)

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

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

'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');
  }
});

答案 1 :(得分:0)

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

  ./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中所有可用的代码