MODULE 6 · 登入與驗證 · 6-14

你的 App 現在認得誰?

前面三課(選型三部曲)你已經想清楚要給用戶哪些登入選項,再往前你也選好了資料庫、畫好了 schema,連 users 這張表都準備好了。從這一課開始,我們要把它「安全地實作出來」。第一個要解決的問題是:這張表裡的「人」是怎麼進來的?使用者要怎麼證明「我就是我」,而不是隨便一個人冒充?這就是 Authentication(身分驗證),也是讓 App 從玩具變成產品的第一道門。

本課地圖(6-14 Google Login)
01Authentication 到底是什麼
02為什麼別自己存密碼
03Google 登入的 redirect 旅程
04在 Firebase 開 Google 登入
05登入按鈕只要一行
06Session 與 Auth Debug
01 · 這是什麼

Authentication:證明「你是誰」

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

你是誰
Authentication 身分驗證
確認你是誰。像進場前先驗證件。YouTube、Spotify 那顆「Continue with Google」做的就是這件事。這一課的主角。
你能做什麼
Authorization 授權
驗明身分後,你被准許做哪些事(小明只能改自己的訂單)。先有 Authentication 才談得上它,留到 6-15。
沒有 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 才知道要認真做門禁。
02 · 為什麼

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

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

📋 users(你自己建的表)最糟
emailpassword 欄存的東西
ming@x.comhunter2
hua@x.comhunter2
密碼原封不動存進資料庫。任何能看到這張表的人(工程師、被駭客拿到 dump 的人)都直接看到所有人的密碼。更慘的是很多人在多個網站用同一組密碼,你這一漏,他們的 Gmail、銀行可能跟著淪陷。
兩個人剛好用同一組密碼,看存進去長怎樣
改改看,左兩欄永遠撞在一起
使用者① 明文② MD5(無 salt)③ bcrypt(每人不同 salt)
小明hunter2f181ec537487dab0$2a$10$x9Kf22cbb9461d87abc
小華hunter2f181ec537487dab0$2a$10$Qp7Lm0beae0e3c00533d
明文兩列一模一樣:誰看到表,誰就看到密碼。
MD5 兩列也一樣:密碼相同就撞在一起,彩虹表一查就破。
bcrypt 各加一段 salt,同密碼也存成兩個完全不同的值。
🧮 為什麼要手動走這一遍?不是因為「以後工作你要自己 hash 密碼」,正好相反,這件事該交給 Firebase。就像有計算機你還是先學會手算,理解底層原理,你才知道 AI 幫你接的 Auth 為什麼是對的,哪天它沒接好你也看得出來。
📝想一下
你接手一個 AI 幫忙寫的後端,打開資料庫看到 users 表有一個 password 欄,裡面存著看得懂的字串。最該做的是什麼?
03 · 怎麼運作

OAuth:用 Google 登入的那趟旅程

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

用 Google 登入
OAuth
像拿護照進場:你不把家裡鑰匙交給門口,只出示護照讓他驗章。你的 App 不碰 Google 密碼,只拿一張 Google 蓋章的證明。
一次性票根
authorization code
Google 導你回來時夾帶的一小段碼。它本身不是通行證,要拿去後端再換成真正的 token。
回家的門牌
Callback URL
你事先登記好「Google 辦完事把人送回哪個網址」。兩邊要登記同一個,Google 才敢把人導回來。
your-app.com
💻 你的 App
歡迎使用你的 App請先登入
➡️
accounts.google.com
🔵 Google
(還沒離開 App)
步驟 1 / 6使用者按下「Continue with Google」

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

Network· 跟著上面的步驟,看瀏覽器實際發了哪些請求1 requests
NameMethodStatusType
your-app.com/GET200document
點任一列看它的 method、status 與 Location header。302 是「導向」,200 是「成功載入」。
進階補充:第 4-5 步之間其實還有一道手續(PKCE)

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

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

04 · 怎麼運作(設定面)

在 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。
05 · 落到程式碼

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

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

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

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

06 · 對你的意義

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

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

登入後的隨身證
Session
登入成功後,App 拿來「一直記得你」的東西。它其實由下面兩張 token 組成,存在你的瀏覽器裡。
短效門票
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-15 預告:保護路由 (Middleware)

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