简体   繁体   中英

How do you add an API key in Swagger

I have tried several methods to add a basic API key authorization to Swagger (express swagger). Below is the relevant info from my manifest.

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

I believe I have registered the security definitions in the YAML configuration.

swagger: "2.0"
info:
  ...

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

security:
    - defaultApiKey: []

To finish this configuration I thought I would only need to register the middleware in the SwaggerExpress.create() function. Below is my entire app.js as it currently stands.

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

When I attempt to use this I see the following:

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

I have tried configuring this a few different ways with no success. Did I properly define the API key in YAML and if so what should I do to register the API key handler in my app.js file?

A little bit late, but for future reference. With swagger-express-mw, this is how you can do it (it works for me):

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

I hope it is helpful for someone.

I was able to overcome this issue by transforming the YAML definitions to the JSON format and loading the API definition this way:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM