如何在 Swagger 中添加 API 键

How do you add an API key in Swagger

我尝试了几种方法来为 Swagger(express swagger)添加一个基本的 API 密钥授权。以下是我的清单中的相关信息。

{
  ...
  "main": "app.js",
  "dependencies": {
    "express": "^4.12.3",
    "swagger-express-mw": "^0.1.0"
  },
  ...
}

我相信我已经在 YAML 配置中注册了安全定义。

swagger: "2.0"
info:
  ...

# Set up security for the API
securityDefinitions:
  defaultApiKey:
    type: apiKey
    in: header
    name: defaultApiKey

security:
    - defaultApiKey: []

要完成此配置,我认为我只需要在 SwaggerExpress.create() 函数中注册中间件。以下是我目前的全部 app.js。

'use strict';

var SwaggerExpress = require('swagger-express-mw');
var app = require('express')();
module.exports = app; // for testing

var config = {
  appRoot: __dirname // required config
};

SwaggerExpress.create(config, function(err, swaggerExpress) {
  if (err) { throw err; }

  // Serve the Swagger documents and SwaggerUi
  app.use(swaggerExpress.runner.swaggerTools.swaggerUi());

  // Install security
  app.use(swaggerExpress.swaggerSecurity({
    defaultApiKey: function(req, def, scopes, callback) {
      console.log("hit");
    }
  }));

  // install middleware
  swaggerExpress.register(app);

  var port = process.env.PORT || 10010;
  app.listen(port);
});

当我尝试使用它时,我看到以下内容:

Error initializing middleware
TypeError: swaggerExpress.swaggerSecurity is not a function

我试过几种不同的配置方式,但都没有成功。我是否在 YAML 中正确定义了 API 密钥?如果是,我应该如何在我的 app.js 文件中注册 API 密钥处理程序?

我能够通过将 YAML 定义转换为 JSON 格式并以这种方式加载 API 定义来解决这个问题:

'use strict';

// [INIT PRE-SERVER REQUIREMENTS]
var fs = require('fs');
var os = require('os');
var https = require('https');


var swagger = require('swagger-tools');
var app = require('express')();
var db = require(/* db config path */);
var swaggerObject = require('./api/swagger/swagger.json');

// Configure non-Swagger related middleware and server components prior to Swagger middleware

swagger.initializeMiddleware(swaggerObject, function (middleware) {

  // Intialize middleware
  app.use(middleware.swaggerMetadata());

  // Setup security handlers
  app.use(middleware.swaggerSecurity({
    api_key: function(req, def, scopes, callback) {
      // API KEY LOGIC HERE
      // IF SUCCESSFUL
      callback();
    }
  });

  // Route requests to appropriate controller
  app.use(middleware.swaggerRouter({useStubs: true, controllers: './api/controllers'}));

  // Setup documentation
  app.use(middleware.swaggerUi());

  // Start the server
  var httpsServer = https.createServer({
    // KEY INFO
  }, app);
  httpsServer.listen(443, function() {
    console.log('Server created and listening for requests on port 443.');
  });
});

有点晚了,但供以后参考。 使用 swagger-express-mw,你可以这样做(对我有用):

config: {
    appRoot: __dirname,
    swaggerSecurityHandlers: {
        defaultApiKey: function(req, authOrSecDef, scopesOrApiKey, callback) {
        // code here
        }
    }
}

希望对大家有所帮助。