Topics

使用 Supabase Auth 與 Cloudflare 打造含身分驗證的 Web 應用程式

  • column

初次見面,我是 Liberogic 的 Matsun。
這是我第一次撰寫文章。

從 PHP2Shell 到 HTTP2Shell,資安相關的新聞持續不斷。
Cloudflare 也已公布針對 PHP 漏洞的 WAF 防護措施。
我認為今後不只要關注 Web 系統,也需要更加重視員工的電腦與網路環境。

前幾天,CTO大塚寫了一篇關於使用Supabase與Cloudflare打造專用Web應用程式的文章。
這次接續前文,我將從自己的角度,談談業務應用程式不可或缺的「認證」功能。

在內部系統或面向客戶與合作夥伴的入口網站中,僅能登入是不夠的。必須依使用者區分可檢視的資訊與可使用的功能。為此,我們採用的是Supabase Auth。

業務應用程式通常都需要登入

  • 內部申請與審核系統
  • 會員專屬頁面
  • 客戶專用入口網站
  • 工時與出勤管理
  • 專案管理
  • 門市與據點適用的管理系統

這類 Web 應用程式大多都需要登入功能。
但僅能「輸入 ID 與密碼登入」是不夠的。
例如在內部申請系統中,

  • 一般員工
  • 主管
  • 據點管理者
  • 本部管理者
  • 系統管理者

即使使用相同的應用程式,如 A 公司與 B 公司等,也會因立場不同而可執行的操作有所差異。
若是供交易對象使用的入口網站,A 公司的負責人不應能瀏覽 B 公司的資訊。
在需要驗證的網頁應用程式中,

  • 確認「使用者是誰」的身分驗證
  • 決定「該使用者可以做什麼」的權限管理

需要分開考量。

使用 Supabase Auth 統一管理登入部分

Supabase Auth 是 Supabase 提供的身分驗證功能。例如,

  • 電子郵件地址 + 密碼
  • Magic Link
  • 一次性密碼(OTP)
  • 使用 Google 等的社群登入

等方式。
業務應用程式通常以電子郵件地址與密碼為主要登入方式,但視用途而定,也可以不設定密碼,改用 Magic Link 登入。從零開始全部由自家團隊實作與維運這些機制並不需要,這點是很大的優勢。
從畫面上看,認證功能似乎只是一個登入表單,但在背後,

  • 使用者註冊
  • 密碼管理
  • 電子郵件地址驗證
  • 登入狀態管理
  • 密碼重設
  • 工作階段管理

等多項處理。
這些認證相關的基礎功能,可以交由 Supabase 負責。

與 Cloudflare 搭配使用的示意

上一篇關於 CTO 的文章中,

我們提到 Cloudflare 負責入口、Supabase 負責資料基礎,

而即使加入了驗證機制,基本概念也是相同的。

ユーザー
  ↓
Cloudflare
  ↓
Next.js
  ↓
Supabase Auth
  ↓
Supabase
 ├ Database
 └ RLS

使用者存取 Web 應用程式並透過 Supabase Auth 登入。
系統會根據已驗證使用者的資訊,在 Next.js 端切換顯示的畫面,或從 Supabase 取得所需的資料。
Cloudflare 仍然作為 Web 應用程式的入口繼續使用。實際上,在這裡還會依需要加入

  • Cloudflare Workers
  • R2
  • SendGrid
  • Box
  • 外部 API

等服務。
不需要把所有功能都只交給 Supabase 處理,也不必全部都只靠 Cloudflare。
我們會依各項服務的特性,分別使用最適合的工具。

依登入使用者切換畫面

舉例來說,假設我們要建立一個供合作廠商使用的入口網站。使用者登入後,

○○株式会社
森本様

現在の案件
資料一覧
お問い合わせ
アカウント設定

會看到如下的畫面。
若是其他公司的人員登入,系統只會顯示該公司的專案與資料。
若管理員登入,則會顯示

  • 所有合作廠商
  • 全部案件
  • 使用者管理
  • 檔案管理
  • 操作紀錄

等管理者專用選單。
單看畫面會覺得很單純,但在背後,

系統會判斷目前登入的是哪一位使用者

,並取得與該使用者相關的資料。
使用 Supabase Auth 時,每位通過驗證的使用者都會有用來識別身分的 ID,我們會將它與業務資料相互關聯。

不要只在瀏覽器端檢查驗證狀態

使用 Next.js 等框架開發 Web 應用程式時,驗證資訊不一定只在瀏覽器端處理。伺服器端也常需要確認「這位使用者是否已登入」。
Supabase 為 SSR 環境提供了以 Cookie 為基礎的驗證方式,在 Next.js 中,客戶端與伺服器端都能處理使用者的工作階段,這個機制非常重要。舉例來說,

/login

任何人都可以看見,但

/dashboard

只限已登入的使用者,

/admin

或只限管理員,依網址單位控制存取權限。
單純隱藏畫面上的「管理」按鈕並不能構成安全機制。
即使有人直接開啟網址或直接呼叫 API,系統仍需在伺服器端與資料庫端進行確認。

驗證與權限管理是不同的事

設計業務應用程式時,驗證與權限管理需要分開考量。
使用 Supabase Auth,

「森本已登入」

這一點可以確認。但是,

「森本可以查看哪些資料」

則是另一個問題。例如,

ユーザー
 ↓
所属会社
 ↓
所属拠点
 ↓
役割
 ↓
閲覧できるデータ

等關係都需要加以設計。
在業務應用程式中,這個部分會因應用程式而有很大差異。
若只有「管理員」與「一般使用者」,設計相對簡單,但是,

  • 總部
  • 分公司
  • 門市
  • 往來客戶
  • 代理商
  • 外部人員

當分公司、門市、往來客戶、代理商或外部人員等角色加入後,權限設計會變得相當複雜。
而若使用 Supabase,在權限控制上最關鍵的是 **RLS(Row Level Security,列級安全性)**。
使用 RLS 時,不論在資料庫端或

  • 僅限自己的資料
  • 僅限同一間公司的資料
  • 僅限同一據點的資料
  • 管理員則可存取全部

可以進行這類控制。
RLS 的具體設計,將在下一篇文章中說明。

也在 Cloudflare 端進行防護

即使有 Supabase Auth,也不代表 Web 應用程式的安全性完全交由 Supabase 負責。在 Cloudflare 端,

  • WAF
  • DNS
  • HTTPS
  • Bot 防護
  • 速率限制
  • 透過 Workers 處理 API
  • 視需要搭配 Cloudflare Access

等功能組合運用。換言之,

Cloudflare
   ↓
Webアプリ
   ↓
Supabase Auth
   ↓
権限制御
   ↓
Database

我們會將其分成數個層級來思考。
「有登入畫面就安全」並不是這樣的。
Web 應用程式需要分別在入口、應用程式、API 與資料庫等各個層級進行適當的控制。

例如可用於以下這類應用程式

Supabase Auth 與 Cloudflare 的組合,可應用於各式各樣的業務應用程式。

內部申請・審核應用程式

  • 員工登入後登錄申請,由主管或管理員進行核准
  • 一般員工僅能檢視自己的申請
  • 主管可檢視所屬部門
  • 管理員可檢視全體

等權限控管。

客戶專用入口網站

為每家往來廠商核發帳號,

  • 案件資訊
  • 資料
  • 檔案
  • 公告
  • 諮詢紀錄

等內容。
雖然是同一個 Web 應用程式,但依登入的公司不同,顯示的內容也會有所差異。

會員專屬頁面

僅限會員本人可以

  • 查看登錄資料
  • 申請紀錄
  • 合約資訊
  • 檔案
  • 各項設定

等資料。

據點管理系統

全國各地門市與營業據點的負責人登入後,即可登錄所屬據點的資訊。
總公司端可以統一確認所有據點的資料。
此類用途也能結合 Supabase Auth 與權限控制一併使用。

不必從頭自行建置認證基礎架構

過去若要開發需要登入驗證的業務系統,首先必須設計認證伺服器要如何架設、工作階段(Session)要如何管理,以及如何與資料庫連結。
當然,現在仍然需要進行這些設計。
不過透過使用 Supabase Auth 這類機制,可以減少從零建置認證基礎架構的工作量。因此能將時間投入在

  • 誰可以看到什麼內容
  • 誰可以操作什麼功能
  • 業務上需要哪些權限

等真正應該思考的問題上。
個人認為,這一點正是在業務應用程式中使用 Supabase 的一大優勢。

總結

結合 Supabase Auth 與 Cloudflare,即使架構相對簡單,也能開發出具備認證功能的 Web 應用程式。
但關鍵不在於建立登入畫面。
對於已通過認證的使用者,

  • 要讓他們看到什麼內容
  • 要讓他們能操作哪些功能
  • 要讓他們能存取哪些資料

設計到位後,才能成為可實際用於業務的 Web 應用程式。
Supabase Auth 負責確認「使用者是誰」,之後的權限控制則是在應用程式與資料庫端組合實現,大致是這樣的架構概念。

下一篇將介紹如何在業務應用程式中使用 Supabase 的 RLS。

關於撰寫本文的人

平時較為隨性自在,但對於在意的事情,會一直查到自己理解為止。今天也在不斷嘗試與修正中,安靜地投入開發工作。

Matsun

前端工程師

查看此員工的文章

我們的優勢在於穩健的團隊體制與快速的應對能力

Liberogic 由經驗豐富的資深人員積極推動專案,因此獲得客戶的高度評價。
我們會妥善指派專案經理與總監,致力於順利推進整體專案。 我們採取依據專案需求適才適所分配資源的方式,避免因全程投入而增加不必要的成本,並且在掌握業務內容、製作與提交估價方面的速度也廣受好評。

注: 本公司不積極承接類似 SES 的駐點業務等,敬請事先諒解。

可搭配 Slack、Teams、Redmine、Backlog、Asana、Jira、Notion、Google Workspace、Zoom、Webex 等幾乎所有主要的專案管理工具與聊天工具使用。

歡迎諮詢您的 Web 相關問題。

案例分析