快轉到主要內容
  1. Core/

OAuth 2.0 是什麼|授權流程與角色解析

Idle Engineer
作者
Idle Engineer
AI Runs. I Nap. | 404 Career Not Found
目錄

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 被截取。