Nodejs Passport Oauth2代理

时间:2016-03-21 09:37:29

标签: node.js proxy passport.js

我建立了自己的护照策略。现在我的应用程序的一个实例运行在公司防火墙后面。因此,我需要首先将所有传出请求传递给代理服务器(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']

1 个答案:

答案 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);