《PWA學習與實踐》系列文章已整理至gitbook - PWA學習手冊,文字內容已同步至learning-pwa-ebook。轉載請註明作者與出處。
本文是《PWA學習與實踐》系列的第四篇。是我在測試其他demo時遇到的一個問題,算是一篇TroubleShooting。
PWA作為時下最火熱的技術概念之一,對提升Web應用的安全、效能和體驗有著很大的意義,非常值得我們去了解與學習。對PWA感興趣的朋友歡迎關注《PWA學習與實踐》系列文章。
引言
在前一篇文章《讓你的WebApp離線可用》中,我們使用Service Worker來做快取與離線支援。是有一個重要的問題:Service Worker必須要在HTTPS協議下才能執行(或者localhost)。當然,對於一些只有前端資源(不涉及後端服務)的demo,我們完全可以將這些前端(靜態資源)託管在一個HTTPS服務下,使得Service Worker可以使用。我選擇了google的FireBase來託管demo(其實github page也是個不錯的選擇)。
使用FireBase非常簡單,只需要firebase login
-->firebase init
-->firebase deploy
即可。但是在firebase login
的過程中,遇到了一些問題。這篇文章主要總結了我在firebase login
遇到的問題及解決方式:
- 無法獲取authorization code
Authentication Error: Your credentials are no longer valid.
有需要的朋友可以繼續看。
首先,如果你對firebase完全不瞭解,下面會有一段非常簡短的介紹。
什麼是FireBase
前段時間學習PWA,在跟著官方教程完成demo後,想要在手機上測試一下效果。然而,遇到的一個問題就是:PWA需要HTTPS協議(或者使用localhost)。
這就需要我們有一個HTTPS的服務,並在其上面部署我們本地寫好的demo。而官方demo的最後,推薦使用firebase來託管你的程式碼。
在FireBase的眾多使用場景中,Develop -> Hosting(託管)就是我需要用到的了。然而,在執行firebase login
(賬號登入)過程中,卻遇到了一些問題。
問題一:在瀏覽器登入賬號後,無反應(無法獲取authorization code)
最開始,我在CLI中輸入firebase login
,選擇y
後,CLI會需要一個authorization code;而瀏覽器會開啟並提示你進行登入。
這裡我用google賬戶進行授權登入。然而,在授權之後,卻遲遲沒有響應(無法得到authorization code)。這時候,我發現瀏覽器顯示,似乎是在等待localhost
進行響應。
解決這個問題的方法就是:在登入時,使用firebase login --no-localhost
進行登入。
重新使用firebase login --no-localhost
登入。這裡我選擇了google賬號進行登入,重複上面的過程:
這次,你就會在瀏覽器中獲得一串authorization code值:
將它貼上到CLI中即可。【問題一】解決!
問題二:Error: Authentication Error: Your credentials are no longer valid.
然而,在CLI中輸入authorization code之後,在等待了較長時間的驗證後,CLI中報出瞭如下錯誤:
這是怎麼回事呢?通過查閱一些資料發現,這很可能是你在電腦上使用“翻牆”工具所導致的。firebase-tool依賴的npm包(faye-websocket)中,未開啟代理的相關設定,因此無法進行驗證。
解決這個問題的方法有兩種:
方法一:在路由器上設定代理,而非本機
有些文章指出,通過在路由器上設定代理,而非在本機開啟代理,可以避免這個問題。不過由於一些原因,暫時還沒有嘗試這種方式,不過通過一些反饋來看,應該是一個有效的方法。
方法二:(hack) 修改程式碼與相關環境變數
該方法較第一種方法來看,會稍微“硬”那麼一些。具體的操作方式如下:
- 設定環境變數
http_proxy
,我本機的代理使用的是1087埠。export http_proxy=http://localhost:1087
- 修改faye-websocket,開啟代理配置。faye-websocket是firebase依賴的一個WebSocket庫,需要為其client.js新增如下配置:
var Client = function(_url, protocols, options) {
options = options || {};
// 新增proxy配置
options.proxy = {
origin: 'http://localhost:1087',
};
…
}
複製程式碼
如果你是全域性安裝的firebase-tools,你可以通過如下方法找到client.js
NODE_PATH=`npm prefix -g`
// client.js的位置
$NODE_PATH/lib/node_modules/firebase-tools/node_modules/firebase/node_modules/faye-websocket/lib/faye/websocket/client.js
複製程式碼
-
設定環境變數NODE_TLS_REJECT_UNAUTHORIZED。
export NODE_TLS_REJECT_UNAUTHORIZED=0
-
重新登入,
firebase login --no-localhost
,重複之前的操作。你會發現,登入成功!
【問題二】解決!
p.s. 針對這個問題,github上也有一個issue:Unable to deploy behind a proxy。
此外,如果你使用了代理,推薦使用全域性代理的方式,使你的CLI也使用代理。
寫在最後
最後,還是回到我開發PWA時的需求。文章最開始提到了,我是為了在移動端測試PWA demo的效果,所以使用FireBase來託管資源。當然,除了FireBase,還有下面兩個辦法:
-
使用github page。由於github全站都是執行在HTTPS下,因此在github page上託管的靜態站點可以使用Service Worker;
-
使用localhost/127.0.0.1。瞭解PWA的話,你會知道除了HTTPS之外,也可以使用localhost(這一設計是為了方便本機除錯)。
本文是《PWA學習與實踐》系列中的第四篇。這篇文章並沒有探討PWA中實際的技術,而是記錄了我在開發、除錯P過程與遇到的問題。可能有朋友也會遇到類似問題,因此記錄下來和大家分享。
在下一篇文章中,我們還是會回到PWA背後的技術,來了解一下,如何使用Push API來實現後端服務向客戶端進行訊息推送。
《PWA學習與實踐》系列文章
- 第一篇:2018,開始你的PWA學習之旅
- 第二篇:10分鐘學會使用Manifest,讓你的WebApp更“Native”
- 第三篇:從今天開始,讓你的WebApp離線可用
- 第四篇:TroubleShooting: 解決FireBase login驗證失敗問題(本文)
- 第五篇:與你的使用者保持聯絡: Web Push功能
- 第六篇:How to Debug? 在chrome中除錯你的PWA
- 第七篇:增強互動:使用Notification API來進行提醒
- 第八篇:使用Service Worker進行後臺資料同步
- 第九篇:PWA實踐中的問題與解決方案
- 第十篇:Resource Hint - 提升頁面載入效能與體驗
- 第十一篇:從PWA離線工具集workbox中學習各類離線策略(寫作中…)