1. Client Credentials Flow(用於機器對機器 M2M 通信)
用法
- 適用於伺服器與伺服器之間的通訊,而不涉及用戶(例如後端 API 之間的互動)。
- 應用程式(client)本身就是資源擁有者(resource owner),所以不需要用戶輸入帳號密碼。
- 適合後端服務、批次任務、無人值守的 API 調用。
流程
- Client(應用程式)使用 client ID + client secret 來向 OAuth 授權伺服器請求 token。
- 授權伺服器核對 client 的身份後,直接回傳 access token。
- Client 使用 access token 存取資源伺服器(Resource Server)。
示例
- 伺服器 A 需要存取伺服器 B 提供的 API(例如 AWS Lambda 服務調用 AWS API)。
2. Implicit Flow(已被淘汰)
用法
- 舊有的前端應用程式(SPA,Single Page Application) 使用這種方式獲取 access token,但已被淘汰,因為它不安全(token 暴露在 URL 中)。
- 不需要交換授權碼(authorization code),而是直接獲得 access token,因此攻擊者可以輕易攔截。
流程
- 用戶在瀏覽器上打開客戶端應用,並被導向 OAuth 授權伺服器的授權頁面。
- 用戶授權後,OAuth 伺服器直接將 access token 附加到 URL(redirect URL fragment)。
- 客戶端(前端應用)解析 URL,提取 access token,然後用來存取 API。
示例
- 舊版單頁應用(SPA) 使用 JavaScript 直接請求 OAuth 伺服器來獲取 access token。
為什麼淘汰?
- Access token 暴露在 URL,容易被竊取(例如透過惡意 JavaScript 或記錄瀏覽器歷史記錄)。
- 無法安全地驗證客戶端(因為瀏覽器應用沒有安全的 client secret)。
👉 解決方案:使用 Authorization Code Flow + PKCE(適用於 SPA 應用)。
3. Authorization Code Flow(適用於 Web 應用,最常見)
用法
- 適用於 Full-Stack Web 應用程式,例如:
- 使用 React/Vue/Angular 前端 + Express/Django/Spring Boot 後端
- 第三方 OAuth 登入(例如 Google、Facebook 登入)
- 透過 兩個 API 請求 獲取 access token,提高安全性:
- 先取得 授權碼(authorization code)
- 再交換 access token
流程
- 用戶請求登入:客戶端(Web 應用)引導用戶到 OAuth 授權伺服器進行身份驗證。
- 獲取授權碼:用戶授權後,OAuth 伺服器將授權碼(authorization code) 傳回給客戶端(透過 redirect URL)。
- 交換 access token:
- 客戶端(後端)使用 授權碼 + client secret,向 OAuth 伺服器請求 access token。
- OAuth 伺服器回應 access token,之後客戶端可用該 token 存取 API。
示例
- Google OAuth 登入:
- 用戶透過 Google 登入你的網站
- 你的伺服器用授權碼換 access token
- 伺服器用 access token 請求 Google API 來獲取用戶資料
👉 變體:Authorization Code Flow + PKCE
- 適用於無後端的前端應用(SPA),透過 PKCE(Proof Key for Code Exchange)機制防止攻擊者竊取授權碼。
4. Resource Owner Password Credentials Flow(已不建議使用)
用法
- 允許用戶直接輸入帳號密碼,並用來換取 access token。
- 適用於完全信任的應用程式(例如內部系統),但不建議用於公開的 OAuth 授權流程。
流程
- 用戶輸入帳號密碼,客戶端直接將這些資訊傳給 OAuth 伺服器。
- OAuth 伺服器驗證後,回傳 access token,客戶端即可使用該 token 存取 API。
示例
- 企業內部的 API 服務,允許員工直接用 AD(Active Directory)帳號密碼登入,換取 access token。
為什麼不建議?
- 帳號密碼直接傳輸,風險很大(攻擊者可能攔截)。
- 不符合 OAuth 設計理念(OAuth 旨在透過 token 來減少密碼暴露)。
👉 解決方案:使用 Authorization Code Flow。
比較總結
Flow | 適用情境 | 安全性 | 特色 |
---|---|---|---|
Client Credentials Flow | 伺服器對伺服器 | ✅ 高 | 適用於機器間 API 呼叫,不涉及用戶 |
Implicit Flow(已淘汰) | 單頁應用(SPA) | ❌ 低 | 直接回傳 access token,容易被攔截 |
Authorization Code Flow | Web 應用(OAuth 登入) | ✅ 高 | 先獲取授權碼,再交換 access token(可加 PKCE 強化安全) |
Resource Owner Password Flow(不推薦) | 內部 API、可信應用 | ⚠️ 低 | 用戶直接提供密碼,風險高 |
總結
- Client Credentials Flow:適用於機器對機器(M2M),不涉及用戶。
- Implicit Flow(淘汰):SPA 直接獲取 access token,不安全,已被 Authorization Code Flow + PKCE 取代。
- Authorization Code Flow:適用於標準 OAuth 登入(Google/Facebook),最常用。
- Resource Owner Password Flow(不推薦):用戶直接提供密碼,安全性低,不建議。
🚀 建議使用 Authorization Code Flow
或 Authorization Code Flow + PKCE
(前端 SPA)來確保