TL;DR | 面試情境模擬 #
👴 面試官:OAuth 2.0 是什麼?授權流程怎麼運作?
🧑💻 你:OAuth 2.0 是一個授權框架,讓第三方應用程式可以在不拿到你密碼的前提下,取得你在另一個平台的資源。例如用 Google 帳號登入 Notion,整個過程 Notion 拿到的是 Google 發的 Access Token,不是你的 Google 密碼。核心是 Authorization Code Flow:使用者授權 → Google 發 Code → App 用 Code 換 Token。
比喻:停車場代客泊車 #
你把車停在飯店,給代客泊車人員一把備用鑰匙(Access Token),這把鑰匙只能開車門、不能打開後車廂(有限制範圍)。你不需要把主鑰匙(密碼)交出去,代客人員的工作做完後,你也可以讓這把備用鑰匙失效。
四個角色 #
| 角色 | 說明 | 例子 |
|---|---|---|
| Resource Owner | 資源擁有者,就是你 | 使用者本人 |
| Client | 想要取得資源的應用程式 | Notion、Spotify |
| Authorization Server | 驗證身份、發 Token | Google Auth Server |
| Resource Server | 存放實際資源的 API | Google API(你的個人資料) |
Authorization Code Flow(最常見) #
使用者 Client App Authorization Server
│ │ │
│ 點「用 Google 登入」 │ │
│──────────────────────> │ │
│ │── 重導向 Google 登入頁 -> │
│ │ │
│<── 顯示 Google 授權頁面 ───────────────────────── │
│ │ │
│── 使用者同意授權 ─────────────────────────────────> │
│ │ │
│ │<── Authorization Code ── │
│ │ │
│ │── Code + Client Secret -> │
│ │ │
│ │<── Access Token ──────── │
│ │ │
│ │── 用 Access Token 呼叫 API │
為什麼要 Code 換 Token,而不是直接給 Token? #
Authorization Code 是短暫的(通常 10 分鐘),只能用一次,且透過後端(Server-to-Server)換 Token。這樣 Access Token 不會暴露在瀏覽器的 URL 或 history 裡,更安全。
Scope:授權範圍 #
OAuth 2.0 可以精確控制授權範圍:
scope=email profile // 只讀取基本資料
scope=https://mail.google.com/ // 讀取 Gmail
scope=calendar.events // 新增日曆事件
使用者在授權頁面會看到「這個應用程式將能夠:讀取你的個人資料、查看你的 Gmail」,可以選擇同意或拒絕。
💡 面試官可能會追問 #
Q1:OAuth 2.0 是認證(Authentication)還是授權(Authorization)? #
是授權,不是認證。OAuth 2.0 只回答「你能做什麼」,不回答「你是誰」。要做認證(確認身份)需要在 OAuth 2.0 上面加 OpenID Connect(OIDC),它會額外回傳一個 ID Token(JWT 格式)包含使用者身份資訊。
所以「用 Google 登入」其實是 OAuth 2.0 + OIDC 一起用。
Q2:Access Token 和 Refresh Token 的差別? #
- Access Token:短命(15 分鐘到 1 小時),直接帶在 API 請求裡
- Refresh Token:長命(幾天到幾週),只用來換新的 Access Token,不直接呼叫 API
Q3:什麼是 PKCE? #
Proof Key for Code Exchange,給沒有 Client Secret 的場景用(例如 SPA 或手機 App,因為 Secret 無法安全儲存)。改用動態生成的 Code Verifier + Code Challenge 來防止 Authorization Code 被截取。