added eurekaclient; flags for oauth plugin
diff --git a/eurekaclient/eureka-client.json b/eurekaclient/eureka-client.json new file mode 100644 index 0000000..9f18ea1 --- /dev/null +++ b/eurekaclient/eureka-client.json
@@ -0,0 +1,15 @@ +{ + "instance":{ + "app": "microgateway", + "vipAddress": "microgateway", + "dataCenterInfo":{ + "name": "MyOwn" + }, + "port": {} + }, + "eureka":{ + "host": "localhost", + "port": 8761, + "servicePath": "/eureka/apps/" + } +} \ No newline at end of file
diff --git a/eurekaclient/index.js b/eurekaclient/index.js new file mode 100644 index 0000000..49d1969 --- /dev/null +++ b/eurekaclient/index.js
@@ -0,0 +1,82 @@ +'use strict'; +/** + * This plugin integrate with Eureka and gets the target + * endpoint dynamically. + */ + +var debug = require('debug')('plugin:eurekeclient'); +var util = require('util'); +var os = require('os'); +var config = require('./eureka-client.json'); + +const lookup = require('./servicelookup.json'); +const port = 8000; +const Eureka = require('eureka-js-client').Eureka; + + +function getIPAddr() { + var interfaces = os.networkInterfaces(); + var addresses = []; + for (var k in interfaces) { + for (var k2 in interfaces[k]) { + var address = interfaces[k][k2]; + if (address.family === 'IPv4' && !address.internal) { + addresses.push(address.address); + } + } + } + return addresses[0]; +} + +config.instance.hostName = os.hostname(); +config.instance.ipAddr = getIPAddr(); +config.instance.port["$"] = port; +config.instance.port["@enabled"] = true; +config.instance.dataCenterInfo["@class"] = "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo"; + +const client = new Eureka(config); + +client.start(); + +module.exports.init = function (config, logger, stats) { + + function getAppName(url) { + for (var index in lookup) { + if (url.includes(lookup[index].uri) || url == lookup[index].uri) { + return { + app: lookup[index].app, + secure: lookup[index].secure + }; + } + } + return ""; + } + + function getTarget(app, secure) { + var instances = client.getInstancesByAppId(app); + + for (var index in instances) { + if (instances[index].status == "UP") { + return (secure == true) ? {"hostName": instances[index].hostName, "port": instances[index].securePort["$"]} : {"hostName": instances[index].hostName, "port":instances[index].port["$"]}; + } + } + return ""; + } + + return { + onrequest: function(req, res, next) { + var appInfo = getAppName(req.url); + var endpoint = getTarget(appInfo.app, appInfo.secure); + + req.targetHostname = endpoint.hostName; + req.targetPort = endpoint.port; + req.targetPath = req.url; + if (appInfo.secure) { + req.targetSecure = true; + } else { + req.targetSecure = false; + } + next(); + } + }; +}
diff --git a/eurekaclient/package.json b/eurekaclient/package.json new file mode 100644 index 0000000..c3443bd --- /dev/null +++ b/eurekaclient/package.json
@@ -0,0 +1,14 @@ +{ + "name": "eurekaclient", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "eureka-js-client": "^4.3.0" + } +}
diff --git a/eurekaclient/servicelookup.json b/eurekaclient/servicelookup.json new file mode 100644 index 0000000..958dfe4 --- /dev/null +++ b/eurekaclient/servicelookup.json
@@ -0,0 +1 @@ +[{"uri": "/book", "app": "BOOK", "secure": false},{"uri":"/httpbin", "app": "BOOK", "secure": false}] \ No newline at end of file
diff --git a/index.js b/index.js index 5540030..01f90dd 100644 --- a/index.js +++ b/index.js
@@ -11,5 +11,6 @@ 'quota-memory':require('./quota-memory'), spikearrest:require('./spikearrest'), 'transform-uppercase':require('./transform-uppercase'), - accesscontrol:require('./accesscontrol') + accesscontrol:require('./accesscontrol'), + eurekaclient:require('./eurekaclient') }
diff --git a/oauth/index.js b/oauth/index.js index 1e4162b..9521cee 100644 --- a/oauth/index.js +++ b/oauth/index.js
@@ -3,7 +3,7 @@ var debug = require('debug')('plugin:oauth'); var url = require('url'); var jwt = require('jsonwebtoken'); -var request = require('request'); +var requestLib = require('request'); var _ = require('lodash'); const authHeaderRegex = /Bearer (.+)/; @@ -15,14 +15,39 @@ module.exports.init = function (config, logger, stats) { var apiKeyCache = {}; + var request = config.request ? requestLib.defaults(config.request) : requestLib; var middleware = function (req, res, next) { var authHeaderName = config['authorization-header'] ? config['authorization-header'] : 'authorization'; var apiKeyHeaderName = config['api-key-header'] ? config['api-key-header'] : 'x-api-key'; var keepAuthHeader = config['keep-authorization-header'] || false; + //support for enabling oauth or api key only + var oauth_only = config['allowOAuthOnly'] || false; + var apikey_only = config['allowAPIKeyOnly'] || false; + // var apiKey; + //support for enabling oauth or api key only + if (oauth_only) { + if (!req.headers['authorization']) { + debug('missing_authorization'); + return sendError(req, res, next, logger, stats, 'missing_authorization', 'Missing Authorization header'); + } else { + var header = authHeaderRegex.exec(req.headers['authorization']); + if (!header || header.length < 2) { + debug('Invalid Authorization Header'); + return sendError(req, res, next, logger, stats, 'invalid_request', 'Invalid Authorization header'); + } + } + } + else if (apikey_only) { + if (req.headers[authHeaderName]) { + debug('Invalid Authorization Type'); + return sendError(req, res, next, logger, stats, 'invalid_auth', 'Invalid Authorization type'); + } + } + //leaving rest of the code same to ensure backward compatibility if (!req.headers[authHeaderName]) { if (apiKey = req.headers[apiKeyHeaderName]) { exchangeApiKeyForToken(req, res, next, config, logger, stats, middleware, apiKey);