分享一个能够帮你作出艰难决定的网站,还有解决国内 Firebase 可用性问题的姿势

2023-01-20 17:51:54 +08:00
 nomagick

公司的产品,Rationale, 让 AI 帮你做利弊分析,啥事都能让他说出点利弊来,挺萌的。

这是一个 prompt programming 的产品, 大致原理是使用一系列 prompt 模版和机器翻译,最终定向地让 text-davinci-003 生成反馈。

https://rationale.jina.ai

https://rationale.jinaai.cn

然而这并不是本帖的重点,重点是这是一个 Firebase 应用。 Firebase 在国内是和谷歌连坐封掉的,但我看网上中英文都没法搜到解决国内 Firebase 可用性问题的资料,所以这里分享一下。 这次老夫踩坑的主要是浏览器,所以这里只谈浏览器。

大致包括以下几个要点,

Service Worker 是这个方案的基础,使用 SW 可以劫持页面上的所有请求,所以只要把谷歌的请求截取并通过代理访问,页面内就好像和谷歌直接通信一样,并且这种效果是跨标签页的。

既然是通过代理访问,那么必然需要一台代理服务器,并且因为客户端是浏览器,全程需要在 http 和域内完成。 经过老夫的踩坑,发现 Nginx 是可用的,原本想使用 Node.js , 然而 FireStore 死活返回 400 ,即便 node.js 内使用 http2 连接上游也是一样,据我推测可能需要代理两侧都使用 http2 。

具体来讲,nginx 配置中 proxy_pass 给某个请求头的值,并删掉这个请求头,形成一个有通用性的代理,SW 中截取谷歌的请求,将原域名设置到请求头里,访问代理的域名。 同时再搞定代理这个域名自己的 CORS 跨域,随手加上一个 Referrer 检查防止滥用。

另外还需要解决登录时的跳转问题。Firebase 的默认 authDomain 一般是 [app-id].firebaseapp.com, 这会跳出应用自己的域外,SW 代理会失去效果。 所以需要把 authDomain 设成相同域。 具体操作上把 /__/auth/ 反代到 [app-id].firebaseapp.com, 这也是官方文档中提到并且推荐的方式。

至此在域内解决了 Google 服务的可访问性问题。目前就走出这一条可行的路,如果有其他姿势也欢迎交流。

值得注意的是,这个 SW 代理是项目无关的,理论上讲可以放在任何网站内解决域内任何被封服务的可用性问题。推广一下,服务的区域限制也可以用这种方式绕过甚至做区域的自由切换。

最后, 因为是基于 SW 的代理,所以不支持 SW 的环境是没有这种效果的。iOS 上包括微信和 Chrome 在内,除 Safari 之外的任何网页,都在此列。 安卓上的体验是可以的,微信内也有 SW 。

1933 次点击
所在节点    分享发现
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/910062

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX