跳至主要內容
SheetForge

Web Google 試算表存取

Google 試算表的存取權限,取決於你帶來的是哪一種憑證。在已部署的網站上,有兩種並存的登入方式:使用 Google 登入(OAuth),或選擇一個由你自己的瀏覽器直接使用的服務帳戶金鑰檔案。Unity/本機路徑則維持不變,繼續使用它僅限本機的服務帳戶金鑰。

在已部署的網站上——OAuth,可讀可寫

在已部署的網站上,一位已登入的使用者可以透過自己的 OAuth token,同時讀取與寫入 Google 試算表。

  • 最小權限原則。 登入時只會要求你的基本個人資料,以及逐檔案授權的試算表存取權限(drive.file):應用程式只能讀取與寫入你已明確為它開啟過的試算表檔案。不會要求任何涵蓋整個帳戶的權限——它無法列出或瀏覽你 Drive 中的其他內容,你尚未為它開啟過的檔案,對它來說仍然不可見。
  • 相同的核心計畫。 網頁上的一次寫入,會經過與其他每一條路徑完全相同的核心計畫,以及相同的共用樂觀鎖驗證——正式試算表會在傳送前的最後一刻重新檢查,因此若某個儲存格在你匯入之後被第三方變更過,該儲存格會被略過,絕不會被覆寫。唯一不同的只有傳輸層:在這條路徑上,它攜帶的是 OAuth bearer token。
  • 試算表自己的 ACL 才是最終權威。 SheetForge 並不決定誰可以寫入,Google 才決定。來自 Google 的 403 會被重新對應為一則誠實的權限訊息,而不是一次部分寫入,因此一次拒絕讀起來就是一次拒絕。

OAuth token 存放在工作階段 cookie 中(一個 JWT),由伺服器端動作使用。唯一的例外是接下來會說明的 Google 檔案挑選工具:它是一個在頁面中執行的 Google 元件,因此開啟它時,會把一個短效的存取 token 交給頁面,用於你自己的這次工作階段。

從挑選工具開始——你永遠不需要 ID

已登入的分頁一開始就會呈現從 Google 選擇試算表:Google 自己的檔案挑選工具會在頁面上開啟,你挑選試算表後,它的 ID 就會填入面板,匯入也會自動接著執行。挑選同時也是讓應用程式在 drive.file 之下取得該檔案存取權的方式,因此同一個動作就完成了兩件事。一列目前的試算表會顯示面板目前指向的是哪一份。

手動輸入 ID 依然可行——只是移到了一個進階:改用試算表 ID 開始的摺疊區塊之下,先前已儲存的 ID 也會一如既往地繼續運作。這裡誠實地標明了但書:Google 只會開啟你至少挑選過一次的檔案,因此指向一個從未被挑選過的檔案的 ID,會被拒絕,直到你挑選它為止(下方的**允許檔案存取…**一列即涵蓋這種情況)。

為應用程式開啟檔案——僅此一次

drive.file 之下,權限是逐檔案累積的。若應用程式遇到一份它還沒有存取權的試算表——例如在「進階」底下輸入的 ID、或換帳戶後仍保留的已儲存 ID——一旦碰到權限錯誤,它就會開啟Google 自己的檔案挑選工具,並且已經先幫你找好那份試算表。只要選擇一次那個檔案,你原本要做的匯入或推送就會自動完成。從那之後,那份試算表的行為就會和一直以來完全一樣。

  • 不需要事先準備。 你不必預先授予存取權;挑選工具會在真正需要的那一刻才出現,並且已經預設好目標檔案,選擇完成後,你原本要求的動作會自動重試。
  • 隨時可以重新授權。 Google 面板一直保留著一列允許檔案存取…,可以隨時重新開啟同一個挑選工具——例如換了另一個 Google 帳戶之後。
  • 誠實劃出的界線。 這個挑選工具是一個在頁面中執行的 Google 元件,因此在使用期間,頁面會握有一個屬於你這次工作階段的短效存取 token(最長一小時有效),這個 token 是從一個需要你登入的同源端點取得的。這與下方金鑰檔案路徑對頁面所託付的信任屬於同一種——真正守住這道界線的,是應用程式嚴格的 Content Security Policy。這個 token 不會被儲存,也不會被記錄。

金鑰檔案分頁刻意保留了它的 ID 欄位:服務帳戶沒有可供挑選的已登入瀏覽工作階段,因此搭配一個已分享給該帳戶的試算表使用 ID,在那裡依然是誠實可行的方式。

在已部署的網站上——由你的瀏覽器簽署的服務帳戶金鑰檔案

Google 面板的第二個分頁接受一個服務帳戶 JSON 金鑰檔案。這把金鑰所做的一切都發生在你的瀏覽器中:

  • 金鑰絕不會送達伺服器。 瀏覽器本身會簽署 token 請求,並直接呼叫 Google 的 API,因此金鑰、已簽署的請求、存取 token 以及你的試算表資料,都絕不會碰到 SheetForge 的伺服器。伺服器端的服務帳戶路由在已部署的網站上依然維持關閉501),與先前完全一樣——這條路徑只是新增了一項能力,而沒有打開任何缺口。
  • 「記住金鑰」誠實地說明它保存了什麼。 如果你選擇記住金鑰,檔案的文字內容會立即被捨棄;真正保留下來的——存放在該裝置、瀏覽器的儲存空間中——是一把頁面上的指令碼可以用來簽署、但絕不能反向讀出的簽署金鑰。任何能開啟該瀏覽器設定檔的人,仍然有可能復原它,因此請把這台裝置視同保管著金鑰檔案本身來對待。忘記金鑰會立即將它移除,涵蓋所有已開啟的分頁,應用程式同時也會請求 Google 撤銷目前的存取 token。
  • 相同的計畫,相同的驗證。 讀取與寫入都會經過與其他路徑相同的核心計畫,以及相同的傳送前驗證。

Unity/本機路徑

Unity 與本機開發伺服器所使用的服務帳戶金鑰,是從一個僅限該機器的路徑讀取的,且絕不會被上傳或封裝——這正是Google 試算表設定中所描述的同一把金鑰;請將它存放在 Assets/ 之外,也存放在儲存庫之外。儲存庫中不含任何憑證。

下拉選單會隨每次推送重新整理

從網頁應用推送之後,試算表的資料驗證下拉選單會自動被重新改寫——所有分頁會在同一批次中一併處理,而參照欄的下拉選單則會被寫成一個涵蓋目標試算表鍵值欄的範圍,因此會隨著記錄增加而自動擴展。若某條規則指向一個不存在的試算表分頁,該規則會被略過並回報。這與編輯器 Google 推送所寫入的結果一致。

各條路徑各自能做什麼

執行位置Google 憑證讀取寫入
Unity/本機服務帳戶金鑰,從僅限該機器的路徑讀取可以可以——精準的儲存格寫入、結構改寫、推送
已部署的網站已登入使用者的 OAuth token(drive.file——為應用程式開啟過的檔案)可以可以——相同的核心計畫+樂觀鎖驗證
已部署的網站你所選擇、由瀏覽器直接使用的服務帳戶金鑰檔案可以可以——相同的核心計畫與驗證;請求會直接從你的瀏覽器送往 Google
已部署的網站伺服器端的服務帳戶路由——皆被關閉(501

無論在哪裡執行,寫入行為都完全相同,因為每一條路徑都共用同一套核心計畫與傳送前驗證。唯一會改變的只有傳輸方式——由瀏覽器簽署的服務帳戶 token、逐使用者的 OAuth bearer,或是本機伺服器的金鑰。

相關頁面