在 swagger nodejs restful 应用程序中集成护照中间件?
Integrating passport middleware in swagger nodejs restful app?
最近开始探索用于 nodejs express 应用程序的 swagger。
据我了解,swagger 是一种框架,需要在 nodejs express 应用程序中遵循约定。 Swagger 使用控制器自动映射路由。
但我觉得,我失去了注入像护照这样的中间件进行身份验证的能力,可以很容易地添加到用户定义的路由中。
我知道有一些方法可以用 swagger 注入中间件,但不知何故我觉得它不像没有 swagger 那样自然。
有没有一种方法可以在我的代码中使用带有最少 swagger 相关组件的 swagger - 可能只有 swagger.yaml 文件?
我想避免使用 req.swagger.param 类代码,并希望利用标准方法来定义路由和注入中间件。
Swagger本身就是一个中间件。当您启动您的应用程序时,swagger 将使用 app.Use([swaggerMiddlewareObject]) 注册自己。所以你可以添加其他中间件before/after 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');
}
});
我的解决方案。需要定义一个中间件
./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))
中可用的所有代码
最近开始探索用于 nodejs express 应用程序的 swagger。 据我了解,swagger 是一种框架,需要在 nodejs express 应用程序中遵循约定。 Swagger 使用控制器自动映射路由。
但我觉得,我失去了注入像护照这样的中间件进行身份验证的能力,可以很容易地添加到用户定义的路由中。
我知道有一些方法可以用 swagger 注入中间件,但不知何故我觉得它不像没有 swagger 那样自然。
有没有一种方法可以在我的代码中使用带有最少 swagger 相关组件的 swagger - 可能只有 swagger.yaml 文件?
我想避免使用 req.swagger.param 类代码,并希望利用标准方法来定义路由和注入中间件。
Swagger本身就是一个中间件。当您启动您的应用程序时,swagger 将使用 app.Use([swaggerMiddlewareObject]) 注册自己。所以你可以添加其他中间件before/after 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');
}
});
我的解决方案。需要定义一个中间件
./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))
中可用的所有代码