Supabase Auth 與 Authgear 在 Next.js:該選哪一個?

Supabase Auth 與 Authgear 都能用於 Next.js App Router 正式環境,但兩者對驗證的設計哲學截然不同。本篇提供務實、平衡的對照、功能表、雙邊設定程式範例,以及何時該選哪一家的決策指引。

Supabase Auth 與 Authgear 在 Next.js:該選哪一個?

2026 年 Next.js 驗證的兩個熱門選項

若你正在開發 Next.js 並研究驗證,很可能會遇到兩條截然不同的路:Supabase AuthAuthgear。兩者皆可用於正式環境、皆與 Next.js App Router 相容,也都有免費方案。但它們對「驗證」的取徑根本不同——而這會依你的技術堆疊大幅影響取捨。

本篇是給開發者在 Next.js 專案中,於 Supabase AuthAuthgear 之間做選擇的務實、平衡比較。不預設誰贏——正解取決於你在做什麼。若想先看 Next.js 驗證的全景,可讀我們的 Next.js 驗證指南,再回來看這篇專題比較。

快速概覽

Supabase Auth 是什麼?

Supabase 是開源的 Firebase 替代方案,將託管 Postgres、即時訂閱、檔案儲存與驗證包在同一平台。Supabase Auth 就是內建於該平台的驗證層。 它不是獨立產品——設計上與 Supabase 的 Postgres 透過 Row Level Security(RLS)政策協同運作。

若你本來就用 Supabase 當資料庫,驗證幾乎是「附贈」的。使用者表在你的 Postgres 裡,你可以直接在 SQL 用 auth.uid() 撰寫 RLS,逐使用者控管資料存取。

Authgear 是什麼?

Authgear 是專注的客戶身分與存取管理(CIAM)平台。它只做一件事——驗證與身分管理——但做得很深。可把它想成「專家」而非「通才」:不包含資料庫或檔案儲存,但內建的驗證功能比多數「順便附的」方案更完整。

Authgear 建於開放標準(OpenID Connect、OAuth 2.0、SAML),內建可自訂的登入 UI,並內建 SAML SSO、通行密鑰(passkeys)、防詐與多租戶 B2B 等企業功能。@authgear/nextjs SDK 是針對 Next.js App Router 打造。

功能對照

功能 Supabase Auth Authgear
通行密鑰(WebAuthn) 不支援(截至 2026 年 3 月) 支援——專用通行密鑰流程與裝置同步
社交登入(Google、GitHub 等) 有——20+ OAuth 提供者 有——10+ OAuth 提供者
SSO(SAML 2.0 / OIDC) SAML 2.0 需 Pro 以上方案 SAML 2.0 + OIDC 全方案皆含(含免費);代管企業 IdP 連線
MFA / TOTP 全方案免費含 TOTP;簡訊 OTP MFA 需付費方案 TOTP、簡訊 OTP、WhatsApp OTP——皆含在內
防詐/濫用防護 非內建 機器人防護、暴力嘗試鎖定、異常偵測
Webhooks 資料庫 webhooks(經 pg_net);驗證事件較有限 專用驗證事件 webhooks(登入、註冊、變更密碼等)
自架 可——開源、Docker 可——開源、Docker
多租戶 / B2B 無內建組織模型 內建 B2B 多租戶入口與角色模型
計價模式 免費:5 萬 MAU。Pro:$25/月起含 10 萬 MAU,超出按量計費 免費:MAU 無上限。付費方案 $50/月起;純驗證計價
Next.js App Router 支援 有——透過 @supabase/ssr 有——原生 @authgear/nextjs SDK

設定方式比較

Next.js 中的 Supabase Auth

Supabase 以 @supabase/ssr 在 Server Components 與 middleware 處理 cookie 工作階段。你會建立兩種 client——瀏覽器與伺服器各一——並加上 middleware 以重新整理權杖。

1. 安裝套件

npm install @supabase/supabase-js @supabase/ssr

2. 在 .env.local 加入環境變數:

NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your-publishable-key

3. 建立伺服器端 client 工具src/lib/supabase/server.ts):

import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";

export async function createClient() {
  const cookieStore = await cookies();

  return createServerClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!,
    {
      cookies: {
        getAll() {
          return cookieStore.getAll();
        },
        setAll(cookiesToSet) {
          try {
            cookiesToSet.forEach(({ name, value, options }) =>
              cookieStore.set(name, value, options)
            );
          } catch {
            // Server Components 可忽略;由 middleware 負責 refresh
          }
        },
      },
    }
  );
}

4. 在伺服器端保護路由時請使用 getClaims()——不要用 getSession()getClaims() 每次呼叫都會依專案公開金鑰驗證 JWT 簽章。getSession() 不會重新驗證權杖,不可用於伺服器端的存取控管。

// src/app/dashboard/page.tsx
import { redirect } from "next/navigation";
import { createClient } from "@/lib/supabase/server";

export default async function DashboardPage() {
  const supabase = await createClient();
  const { data } = await supabase.auth.getClaims();

  if (!data.claims) {
    redirect("/login");
  }

  return <div>Welcome, {data.claims.sub}</div>;
}

你也需要 middleware 在每次請求時重新整理過期權杖——完整範例見 Supabase Next.js 伺服器端驗證文件

Next.js 中的 Authgear

Authgear 提供專用的 @authgear/nextjs SDK,對 App Router 為一等公民。設定採 catch-all route handler——登入、登出、權杖更新等回呼都走同一個 API route,並以 currentUser() 在伺服器端保護頁面。

1. 安裝套件

npm install @authgear/nextjs

2. 在 .env.local 加入環境變數:

AUTHGEAR_ENDPOINT=https://your-project.authgear.cloud
AUTHGEAR_CLIENT_ID=your-client-id
AUTHGEAR_REDIRECT_URI=http://localhost:3000/api/auth/callback
SESSION_SECRET=a-random-string-of-at-least-32-characters

3. 建立共用設定src/lib/authgear.ts):

import type { AuthgearConfig } from "@authgear/nextjs";

export const authgearConfig: AuthgearConfig = {
  endpoint: process.env.AUTHGEAR_ENDPOINT!,
  clientID: process.env.AUTHGEAR_CLIENT_ID!,
  redirectURI: process.env.AUTHGEAR_REDIRECT_URI!,
  sessionSecret: process.env.SESSION_SECRET!,
};

4. 註冊 catch-all route handlersrc/app/api/auth/[...authgear]/route.ts):

import { createAuthgearHandlers } from "@authgear/nextjs";
import { authgearConfig } from "@/lib/authgear";

export const { GET, POST } = createAuthgearHandlers(authgearConfig);

5. 以 currentUser() 保護路由:

// src/app/dashboard/page.tsx
import { redirect } from "next/navigation";
import { currentUser } from "@authgear/nextjs/server";
import { authgearConfig } from "@/lib/authgear";

export default async function DashboardPage() {
  const user = await currentUser(authgearConfig);

  if (!user) {
    redirect("/api/auth/login");
  }

  return <div>Welcome, {user.sub}</div>;
}

逐步說明見 Authgear Next.js 快速入門

設定上的主要差異

兩邊在「基本受保護路由」的複雜度相近。實務差異在於:

  • Supabase 需要兩套 client 工具(瀏覽器與伺服器)外加 middleware。Authgear 只需一個設定物件與一個 route handler。
  • Supabase 工作階段在你的 Postgres 裡。 Authgear 工作階段由 Authgear 雲端服務管理,每次請求在伺服器端驗證。
  • Supabase 的安全模型中心是資料庫。 以 SQL 的 RLS 控制每位使用者能存取什麼。Authgear 的安全模型在資料庫之外——你檢查 currentUser() 並在應用邏輯強制存取規則。

何時選 Supabase Auth

適合在以下情況選 Supabase Auth:

  • 你已經用 Supabase 當資料庫。 若驗證已含在現有方案中,不必再掛一套身分服務。與 RLS 的整合非常實在——能在 SQL 寫 WHERE user_id = auth.uid() 既強大又乾淨。
  • 你做的是中小型專案,不需要進階企業功能。免費層(5 萬 MAU)多數獨立開發與新創情境已夠用。
  • 你想要與 Postgres 緊密整合。 Supabase 的驗證與資料庫功能深度綁定。若存取邏輯主要放在資料庫層,Supabase 很自然。
  • 你重視開源、可自架堆疊。 Supabase 端到端開源;若需要資料主權又不想自建整套驗證,整平台可自架。
  • 你不需要通行密鑰、進階企業 SSO 或內建防詐——或願意在需求成長時另外補上。

何時選 Authgear

以下情況 Authgear 較有優勢:

  • 驗證是你產品最難的一塊。 若你在做 B2B SaaS、金融科技或任何把身分與存取當核心能力的產品,專用 CIAM 能扛複雜度,讓團隊不必自己造輪子。
  • 你需要企業 SSO。 Authgear 在全方案(含免費)即支援 SAML 2.0 與 OIDC,並含代管 IdP 連線。Supabase 的 SAML 需 Pro 以上。
  • 通行密鑰是優先需求。 Authgear 支援專用流程、裝置同步、備援驗證方式與終端使用者帳戶入口。Supabase Auth 目前不支援通行密鑰。
  • 你要開箱即用的防詐。 Authgear 含機器人防護、暴力嘗試鎖定與異常偵測;用 Supabase 則需自建或另接服務。
  • 你在做多租戶 B2B。 Authgear 內建組織與角色模型;Supabase 沒有原生「組織」概念——需在資料庫自行建模。
  • 你沒有用 Supabase 資料庫。 若你用 PlanetScale、Neon 或其他 Postgres,Supabase Auth 的綑綁效益較低;像 Authgear 這類專用驗證平台彈性較大。
  • 你需要細緻的驗證事件 webhooks。 Authgear 可對登入、登出、註冊、變更密碼等事件發送 webhook;Supabase 的 webhook 偏資料庫層,而非驗證事件層級。

結論

沒有放諸四海皆準的贏家——Supabase Auth 與 Authgear 都是紮實方案,能可靠支撐多數 Next.js 應用的驗證。

最簡單的決策句:你在用 Supabase 嗎? 若是,請用 Supabase Auth。資料庫整合、RLS 與一站式計價,對已在 Supabase 生態的專案幾乎是不假思索的選擇。

若你不在 Supabase 上,或需要通行密鑰、企業 SSO、防詐或多租戶 B2B,Authgear 的「專注」會帶來回報——整個團隊聚焦在身分,功能廣度往往不需額外堆設定即可取得。

兩者皆可開源自架,若你需要完整掌控基礎設施。Authgear 免費方案沒有 MAU 上限——可先註冊試用,再決定是否升級付費。

常見問題

可以把 Authgear 和 Supabase 資料庫一起用嗎?

可以。Authgear 與 Supabase 並非二選一。你可以用 Authgear 作身分提供者、Supabase 作資料庫。Authgear 簽發標準 JWT,你可在 API route 先驗證再查詢 Supabase。Authgear 也提供將 Supabase 與任何驗證提供者串接的指南,包含如何從外部 JWT 產生相容 Supabase 的權杖以搭配 RLS。

Supabase Auth 支援 Next.js App Router 嗎?

支援。@supabase/ssr 完整支援 Next.js App Router,含 Server Components、Route Handlers 與 middleware。舊套件 @supabase/auth-helpers-nextjs 已棄用——新專案請使用 @supabase/ssr

Authgear 的 Next.js SDK 能上正式環境嗎?

可以。@authgear/nextjs 原生支援 App Router,含伺服器端以 currentUser() 取得使用者、用於驗證回呼的 catch-all route handler,以及客戶端 Provider 元件。設定步驟與範例程式見官方 Authgear Next.js 快速入門