MODULE 6 · PART 3 · 登入與驗證

你的 App 現在認得誰?

前面幾課你選好了資料庫、畫好了 schema,連 users 這張表都準備好了。但有個問題還沒解決:這張表裡的「人」是怎麼進來的?使用者要怎麼證明「我就是我」,而不是隨便一個人冒充?這就是 Authentication(身分驗證),也是讓 App 從玩具變成產品的第一道門。

本課地圖(6-5 Google Login)
§1Authentication 到底是什麼
§2為什麼別自己存密碼
§3Google 登入的 redirect 旅程
§4在 Firebase 開 Google 登入
§5登入按鈕只要一行
§6Session 與 Auth Debug
§1 · 這是什麼

Authentication:證明「你是誰」

登入這件事,本質上只是 App 在問一個問題:「你真的是你說的那個人嗎?」

概念Authentication(身分驗證)

Authentication 就是「確認你是誰」的過程。你打開 YouTube、Spotify、Notion,看到的那顆「Continue with Google」按鈕,做的就是這件事:在你動任何資料之前,先確認你的身分。

它常跟另一個詞搞混:Authorization(授權),那是「你能做什麼」。先有 Authentication(你是小明),才談得上 Authorization(小明只能改自己的訂單)。這一課先把「你是誰」講清楚,「你能做什麼」留到 6-6 的保護路由。

沒有 Auth任何人都能動任何資料
orders 表
o_001 · 小華的訂單$1200
o_001 · 小華的訂單$1200
有 Auth先證明身分才放行
orders 表
o_001 · 小華的訂單$1200
o_001 · 小華的訂單$1200 (守住了)
🔑VIBE CODER 秘訣
👀觀察
AI 幫你做的 demo 為了「能跑」,常常整個 App 沒有任何登入,所有資料對全世界開放。本機自己玩沒事,一旦上線就是災難。
💬怎麼跟 AI 講
需求講清楚:「這個 App 要上線給真人用,請加上 Authentication,沒登入的人不能讀寫任何使用者資料。」把「上線」「真人」講出來,AI 才知道要認真做門禁。
§2 · 為什麼

第一個念頭通常是錯的:別自己存密碼

很多人想到登入,第一反應是「做一個帳號密碼欄位」。我們手動走一次,看看為什麼這條路很危險,以及為什麼把它交出去才是對的決定。

📋 users(你自己建的表)最糟
emailpassword 欄存的東西
ming@x.comhunter2
hua@x.comhunter2
密碼原封不動存進資料庫。任何能看到這張表的人(工程師、被駭客拿到 dump 的人)都直接看到所有人的密碼。更慘的是很多人在多個網站用同一組密碼,你這一漏,他們的 Gmail、銀行可能跟著淪陷。
🧮 為什麼要手動走這一遍?不是因為「以後工作你要自己 hash 密碼」,正好相反,這件事該交給 Firebase。就像有計算機你還是先學會手算,理解底層原理,你才知道 AI 幫你接的 Auth 為什麼是對的,哪天它沒接好你也看得出來。
📝想一下
你接手一個 AI 幫忙寫的後端,打開資料庫看到 users 表有一個 password 欄,裡面存著看得懂的字串。最該做的是什麼?
§3 · 怎麼運作

OAuth:用 Google 登入的那趟旅程

按「下一步」自己走一遍,看看按下按鈕之後,瀏覽器到底跑去哪、誰在跟誰講話。

概念OAuth 像「拿護照進場」

你進夜店不會把家裡鑰匙交給門口的人,你出示護照,他確認章是真的就放你進去。OAuth 就是這個機制:你的 App 不碰使用者的 Google 密碼,只拿到一張「Google 幫忙蓋章的證明」。所以叫「用 Google 登入」既安全又省事。

your-app.com
💻 你的 App
歡迎使用你的 App請先登入
➡️
accounts.google.com
🔵 Google
(還沒離開 App)
步驟 1 / 6使用者按下「Continue with Google」

一切從這顆按鈕開始。你的 App 不會自己問密碼,而是把使用者交給 Google。

進階補充:第 4-5 步之間其實還有一道手續(PKCE)

精準來說,Google 導回來的不是直接可用的 token,而是一段「authorization code」。要再用這段碼跟 Google 換真正的 token,這一步叫 token exchange,而且發生在後端,因為要用到只有後端才有的密鑰,前端永遠拿不到。

為了防止有人中途攔截這段碼,現代流程還會加上 PKCEstate 兩道防偽(防 CSRF)。好消息是:用 Firebase 的話,這些它都幫你處理好了,你不用自己實作。知道有這層就好。

§4 · 怎麼運作(設定面)

在 Firebase Console 打開那個開關

前面那趟流程要能跑,前提是先在 Firebase Console 把 Google 這個登入方式開起來。我們模擬一遍實際要點哪裡。

🔥 Firebase
Authentication
Firestore Database
Storage
Hosting
↳ Sign-in method
Sign-in providers
🔵GoogleDisabled
🐙GitHub點上面的 Google
🍎Apple點上面的 Google
👆 把 Google 那排的開關打開,看要填什麼
🔑VIBE CODER 秘訣
👀觀察
AI 常常只給你前端那行 signInWithPopup,卻忘了提「登入方式要先在 Firebase Console 開」「Callback URL 要兩邊登記」。結果你一按就壞,還以為是 code 寫錯。
💬怎麼跟 AI 講
把設定面也講清楚:「我用 Firebase 的 Google 登入,請告訴我 Firebase Console 的 Google 登入方式要怎麼開、Callback URL 要貼到 Google Console 哪裡。」設定與程式碼一起問,才不會卡在 redirect_uri_mismatch。
§5 · 落到程式碼

設定做完,前端其實只要一行

難的都在前面那段設定。真正寫的程式碼只有一個 function 呼叫,按下按鈕就會啟動剛才那趟登入旅程。

your-app.com
💻 你的 App
你的 App未登入
按鈕背後那一行(AI 會給你這種 code)
const provider = new GoogleAuthProvider();
await signInWithPopup(auth, provider);

就這樣兩行。GoogleAuthProvider 指定用 Google 登入,signInWithPopup 跳出那個熟悉的選帳號視窗。其餘整趟跳轉、換 token、建 session,Firebase 全包了。

§6 · 對你的意義

登入之後:Session 是什麼,壞了怎麼查

登入成功只是開始。App 怎麼「一直記得你」?出問題時又該往哪看?

概念Session:登入後的一張隨身證

登入成功後,Firebase 在瀏覽器存了兩樣東西:一張 ID token(短效,證明「你現在是登入狀態」)和一張 refresh token(長效,用來在前者過期時換新的)。每次你對後端發請求,就帶著 ID token,後端看一眼就知道是誰。

ElementsConsoleSourcesNetworkApplicationSecurity
Application
▸ Local Storage
▸ Session Storage
▸ IndexedDB
▾ Cookies
https://your-app.com
NameValueDomainPathExpiresSizeHttpOnlySecureSameSite
firebaseIdTokeneyJhbGci….SflKxyour-app.com/2024-05-29 18:00412Lax
firebaseRefreshTokenv1.Mr8…your-app.com/2024-08-27 18:0088Lax
🪲Auth Debug 小挑戰看錯誤訊息,判斷哪裡出錯
📝想一下
使用者登入時遇到這個:Error 400: redirect_uri_mismatch最可能的原因是?
📝想一下
使用者登入時遇到這個:Error: Unsupported provider: provider is not enabled最可能的原因是?
📝想一下
使用者登入時遇到這個:登入後沒有報錯,但 session 一直是 null最可能的原因是?
📝想一下
使用者回報「登入後,頁面一刷新就被登出」。身為 vibe coder,你會檢查什麼?
收尾

這一段你帶走了什麼

密碼別自己存,交給 Firebase Authentication(bcrypt + salt,存在 Firebase 受保護的後端)。
用 Google 登入 = OAuth,你的 App 不碰使用者密碼,只拿一張 Google 蓋章的證明。
Callback URL 要在 Firebase 和 Google Console 兩邊登記,對上才放行。
登入後拿到的是 Session:access token(短效)+ refresh token(自動續命)。
Auth 壞掉先看三處:provider 開了沒、Callback URL 對了沒、callback 有沒有處理 code。
6-6 預告:保護路由 (Middleware)

現在 App 認得你是誰了。但「登入的人才能看 /dashboard」這件事要怎麼擋?未登入的人闖進來又該怎麼導回登入頁?下一段我們用 Middleware 當網站保全,把「你能做什麼」這條界線畫出來。