2016-08-22 118 views
0

我已經嘗試了幾種方法爲Swagger(快速招搖)添加基本API密鑰授權。以下是我清單中的相關信息。如何在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密鑰處理程序?

回答

0

我能夠通過轉換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.'); 
    }); 
}); 
+0

什麼是swagger.json我只有yaml? – danielad

+0

@danielad您可以使用swagger-codegen工具將.yaml轉換爲.json https://github.com/swagger-api/swagger-codegen/blob/master/README.md#to-generate-a-sample-客戶端庫 – Burke9077

+0

即時通訊使用swagger-express-md?我需要swagger-tools還是什麼?兩者如何需要和使用? – danielad

1

有點晚,但以供將來參考。 隨着招搖快車兆瓦,這是你如何能做到這(我的作品):

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

我希望是有人幫助。