Firebase/NodeJS 在代理服务器后面

Firebase/NodeJS behind proxy server

当计算机位于公司代理后面时,如何 运行 NodeJS 上的 Firebase 管理员?

npm 已经配置代理和 https-代理。 npm 命令执行正常。

然而,Firebase 尝试直接访问互联网:

Error: Credential implementation provided to initializeApp() via the "credential" property failed to fetch a valid Google OAuth2 access token with the following error: "connect ETIMEDOUT 216.58.203.45:443".

我尝试将 firebase-admin 下的 faye-websocket\lib\faye\websocket\client.js 更新为阅读

  var Client = function(_url, protocols, options) {
  options = options || {};
  options.proxy = {
    origin: 'http://proxy.server.local:8080'
  };

我尝试了几种变体,但 nodejs 仍在尝试直接访问 216.58.203.45:443。我还应该更新什么才能使其正常工作?

这就是我 运行 我的 FirebaseAdmin 在公司代理后面的方式。

请安装最新的 Firebase Admin Node 版本,即 v6.4.0 及以上。另外,你还需要安装一个tunnel2库。

npm install firebase-admin@6.4.0
npm install tunnel2


var admin = require('firebase-admin');
var serviceAccount = require('path/to/serviceAccountKey.json');
const tunnel = require('tunnel2')
// Create your Proxy Agent 
// Please choose your tunneling method accordingly, my case
// is httpsoverHttp, yours might be httpsoverHttps
const proxyAgent = tunnel.httpsOverHttp({
    proxy: {
      host: 'yourProxyHost',
      port: yourProxyPort,
      proxyAuth: 'user:password' // Optional, required only if your proxy require authentication
    }
});
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount, proxyAgent),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
});

希望对您有所帮助。我为此写了一篇文章。你可以参考那里 the article here

因为我花了一段时间才弄清楚它是如何工作的,所以任何搜索的人都可以:

const proxyAgent = tunnel.httpsOverHttp({
  proxy: {
    host: 'YOUR_PROXY_HOST',
    port: YOUR_PROXY_PORT,
    proxyAuth: 'user:password', // Optional, required only if your proxy require authentication
  },
});

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount, proxyAgent),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com',
  httpAgent: proxyAgent, //this is what I was missing
});