OAuth 4 Flows

1. Client Credentials Flow(用於機器對機器 M2M 通信)

用法

  • 適用於伺服器與伺服器之間的通訊,而不涉及用戶(例如後端 API 之間的互動)。
  • 應用程式(client)本身就是資源擁有者(resource owner),所以不需要用戶輸入帳號密碼。
  • 適合後端服務、批次任務、無人值守的 API 調用

流程

  1. Client(應用程式)使用 client ID + client secret 來向 OAuth 授權伺服器請求 token。
  2. 授權伺服器核對 client 的身份後,直接回傳 access token
  3. 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,因此攻擊者可以輕易攔截。

流程

  1. 用戶在瀏覽器上打開客戶端應用,並被導向 OAuth 授權伺服器的授權頁面。
  2. 用戶授權後,OAuth 伺服器直接將 access token 附加到 URL(redirect URL fragment)。
  3. 客戶端(前端應用)解析 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,提高安全性:
    1. 先取得 授權碼(authorization code)
    2. 再交換 access token

流程

  1. 用戶請求登入:客戶端(Web 應用)引導用戶到 OAuth 授權伺服器進行身份驗證。
  2. 獲取授權碼:用戶授權後,OAuth 伺服器將授權碼(authorization code) 傳回給客戶端(透過 redirect URL)。
  3. 交換 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 授權流程。

流程

  1. 用戶輸入帳號密碼,客戶端直接將這些資訊傳給 OAuth 伺服器。
  2. 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 FlowWeb 應用(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 FlowAuthorization Code Flow + PKCE(前端 SPA)來確保

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *