Firebase在国内使用的一些方法

发布于 · 最后修改时间

Firebase在国内有些地区是可用的,但只是有些,没法保证全国通用,这篇文章谈的是服务端(Node.js)的使用。

前提是电脑跑起来了代理软件,这个怎么搞我就不说了,代理服务器方面我建议用香港的代理服务器,那就很快很稳了。

首先是Firebase-tool这个命令行工具,源码中使用的是request这个库,所以只要在源码里头加上proxy属性就行了。

目前版本来说这个文件是api.js,找到_request这个函数,在里头加上一句:

  options.proxy = "http://127.0.0.1:8118";

比较麻烦的是Firbase-admin这个库,用的是原生的http/https这两个核心的,核心服务都是走https的,所以这篇文章主要就谈一谈原生库如何走代理。我已经将这个库整理到firebase-admin-proxyable这里了,国内用户可以安装这个并看着文档中DEMO的写法来配置自己的代理。

  1. 核心原理就是使用agent这个属性,具体看官方文档。

  2. 在npm里头,绝大多数的代理,核心都是这个库:tunnel-agent,点链接进去没文档,没关系,直接看源码,源码就单文件不到300行。

  3. 然后推荐用caw这个库。源码也是很简单的,读过觉得很靠谱,所以才在这里推荐使用。

以上就是相关的核心基本知识了。
下面是实践:


第一步

const caw = require('caw');

const https = require("https");

https.globalAgent = caw("http://127.0.0.1:8118", {
protocol: 'https'
});

设置全局代理,agent的只有在keep-alive的情况下才会自动触发,去使用globalAgent。

注意,这里:"http://这个代理的协议头不能少,看源码就知道为什么,因为源码很精简,没有去做那些不必要的智能判断,所以包括后面的protocol: 'https'也不能少,这点很重要。

第二步

const admin = require("./firebase-admin");

要把node_modules里头的firebase-admin文件夹拿出来,改源码,当然你也可以手动去跟随维护一个走代理版本的库。

第三步

找到api-request.js文件中https请求的options的定义,添加以下属性。

// firebase-admin\lib\utils\api-request.js
 |  var options = {
 |      method: httpMethod,
 |      host: host,
 |      port: port,
 |      path: path,
 |      headers: headers,
+|      agent: https.globalAgent,
 |  };

找到credential.js文件中requestAccessToken函数,在函数头部添加以下代码

// firebase-admin\lib\auth\credential.js
 |function requestAccessToken(transit, options, data) {
+|    if(transit === https){
+|        options.agent = https.globalAgent;
+|    }
 |    return new Promise(function (resolve, reject) {

2017-8-2补充:
上面说的代理,是针对Google身份校验方面的代理。而在身份校验通过后,就是要开始用wss协议连接到服务器了,这点我补充一下如何配置:
在源码中有这么一段:

0 == this.Wd.indexOf("wss://") ? d.HTTPS_PROXY || d.https_proxy : d.HTTP_PROXY || d.http_proxy;

意思是,wss的代理走的不是nodejs的,而是自己的一套,默认从命令行的环境中获取代理参数,所以如果wss连接不稳定,需要走代理的话:

set https_proxy=http://127.0.0.1:8118

注意,这里头http://这个协议前缀一定要加。