我建立了自己的护照策略。现在我的应用程序的一个实例运行在公司防火墙后面。因此,我需要首先将所有传出请求传递给代理服务器(http),然后连接到外部世界(https)。我使用其他模块运行,例如request
,它提供了传递代理配置的选项。
`app - (http) - >代理 - (https via vpn tunnel) - > www``
1)如何强制我护照策略的传出请求通过代理?
2)如果不可能,只需添加护照选项:如何获得使用代理的所有传出请求?
我注意到策略中有一个代理选项: https://github.com/jaredhanson/passport-oauth2/blob/master/lib/strategy.js#l110
我试图扩展我的策略并传递此选项,但它没有成功。
e.g
Strategy = (options, verify) ->
options = options or {}
options.authorizationURL = options.authorizationURL or 'https://mywebsite.com/oauth2/authorize'
options.tokenURL = options.tokenURL or 'https://mywebsite.com/extern/oauth2/auth_form.aspx'
options.scopeSeparator = options.scopeSeparator or ','
options.proxy = options.proxy or process.env['HTTP_PROXY']
答案 0 :(得分:1)
我可以最终解决所有传出请求的问题:
inspect = require('eyespect').inspector({maxLength: null})
chalk = require('chalk')
url = require('url')
http = require('http')
https = require('https')
setupHttpProxy = ()->
proxyHttp = url.parse(process.env['HTTP_PROXY'])
# console.log chalk.bgRed "proxyHttp"
# inspect proxyHttp
http.globalAgent.options.host = proxyHttp.hostname
http.globalAgent.options.port = proxyHttp.port
# console.log chalk.bgRed "proxyAgent"
# inspect http.globalAgent
return
setupHttpsProxy = ()->
proxyHttps = url.parse(process.env['HTTPS_PROXY'])
# console.log chalk.bgRed "proxyHttps"
# inspect proxyHttps
https.globalAgent.options.host = proxyHttps.hostname
https.globalAgent.options.port = proxyHttps.port
# console.log chalk.bgRed "proxyAgent"
# inspect https.globalAgent
return
module.exports = ()->
setupHttpProxy() if process.env['HTTP_PROXY']?
setupHttpsProxy() if process.env['HTTPS_PROXY']?
return
我扩展了全局代理,该代理用作所有传出连接的默认设置。
https://nodejs.org/api/http.html#http_http_globalagent
gulp-nodemon
轻松修改/重启JS)var inspect = require('eyespect').inspector({maxLength: null});
var chalk = require('chalk');
var express = require('express');
var http = require('http');
var https = require('https');
var fs = require('fs');
var httpProxy = require('http-proxy');
var url = require('url');
var app = express();
//////// OTHER & HELPER ///////////
console.reset = function () {
return process.stdout.write('\033c');
}
process.on('uncaughtException', function (err) {
console.log(err);
});
//////// EXPRESS /////////
app.get('*', function (req, res) {
console.log("req.path", req.path);
res.send('Hello World!');
});
//////// PROXY SERVER ///////////
var inspect = require('eyespect').inspector({maxLength: null});
var chalk = require('chalk');
var express = require('express');
var http = require('http');
var https = require('https');
var fs = require('fs');
var httpProxy = require('http-proxy');
var url = require('url');
//////// OTHER & HELPER ///////////
console.reset = function () {
return process.stdout.write('\033c');
}
process.on('uncaughtException', function (err) {
console.log(err);
});
//////// PROXY SERVER ///////////
var counter = 1;
proxy = httpProxy.createProxyServer();
http.createServer(function (req, res) {
counter++;
console.reset();
console.log(chalk.bgGreen("\n\n\n\n---------------------------------------"+counter+"---------------------------------------------\n\n"));
console.log(chalk.bgGreen("PRE HEADER"));
inspect(req.headers);
console.log(chalk.bgGreen("SECURITY"));
inspect(req.secure);
inspect(req.connection.encrypted);
console.log(chalk.bgGreen("PRE URL"));
inspect(req.url);
console.log(chalk.bgGreen("PRE TARGET"));
target = 'http://' + req.headers.host;
// target = 'https://' + req.headers.host;
inspect(target);
proxy.proxyRequest(req, res, {
target: target,
enable : { xforward: true }
});
}).listen(7000);
var counterHTTPS = 1;
proxyHTTPS = httpProxy.createProxyServer();
sslOptions = {
key: fs.readFileSync(__dirname + '/ssl/development/server.key'),
cert: fs.readFileSync(__dirname + '/ssl/development/server.crt'),
ca: fs.readFileSync(__dirname + '/ssl/development/ca.crt'),
requestCert: true,
rejectUnauthorized: false
}
https.createServer(sslOptions, function (req, res) {
counterHTTPS++;
console.reset();
console.log(chalk.bgGreen("\n\n\n\n---------------------------------------"+counterHTTPS+"---------------------------------------------\n\n"));
console.log(chalk.bgGreen("PRE HEADER"));
inspect(req.headers);
console.log(chalk.bgGreen("SECURITY"));
inspect(req.connection.encrypted);
console.log(chalk.bgGreen("PRE URL"));
inspect(req.url);
console.log(chalk.bgGreen("PRE TARGET"));
if(req.connection.encrypted == true)
target = 'https:';
else
target = 'http:';
target += '//' + req.headers.host;
// target = 'https://' + req.headers.host;
inspect(target);
proxyHTTPS.proxyRequest(req, res, {
target: target,
enable : { xforward: true }
});
}).listen(8000);
//////// EXAMPLE EXPRESS APP ///////////
http.createServer(function (req, res) {
console.log(chalk.bgBlue("URL"));
inspect(req.url);
console.log(chalk.bgBlue("HEADER"));
inspect(req.headers);
console.log("received msg on new server", req.url + '\n' + JSON.stringify(req.headers, true, 2));
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write({"data":'request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2)});
res.end();
}).listen(9000);