OAuth 2.0 與 OIDC

Vibe Prompt

「幫我實作 OAuth 2.0 Authorization Code Flow:前端跳轉到 Google 登入,後端接收 callback 換取 Token。」

四種 Flow

| Flow | 使用場景 | |------|---------| | Authorization Code | 後端有 Server 的應用 | | Implicit | SPA(已不推薦) | | Resource Owner Password | 高度信任的應用(不推薦) | | Client Credentials | 機器對機器 |

Authorization Code Flow

1. 前端 → Google: 跳轉到授權頁面
2. Google → 前端: 授權碼 code
3. 前端 → 後端: 傳授權碼
4. 後端 → Google: 用 code + client_secret 換 token
5. Google → 後端: access_token + id_token + refresh_token
6. 後端 → 前端: session cookie

驗證 ID Token

import jwt

# Google 的 JWKS 端點
jwks_url = "https://www.googleapis.com/oauth2/v3/certs"

# 驗證 id_token
id_token = "eyJhbGciOiJSUzI1NiIsImtpZCI6..."
claims = jwt.decode(
    id_token,
    jwks_client.get_signing_key_from_jwt(id_token).key,
    algorithms=["RS256"],
    audience=CLIENT_ID,
    issuer="https://accounts.google.com"
)

print(f"使用者: {claims['sub']}")
print(f"Email: {claims.get('email')}")
print(f"名字: {claims.get('given_name')}")

簡化授權

使用 Supabase Auth 即可完成 OAuth,不需自行實作。


關鍵要點

OAuth 2.0 Grant Types

| Grant Type | 使用場景 | 安全性 | |-----------|---------|:------:| | Authorization Code + PKCE | SPA / 手機 App | ⭐⭐⭐⭐⭐ | | Authorization Code | 後端渲染的網頁應用 | ⭐⭐⭐⭐⭐ | | Client Credentials | M2M 機器對機器 | ⭐⭐⭐⭐ | | Device Code | 電視、IoT 無瀏覽器裝置 | ⭐⭐⭐ | | Implicit (已棄用) | 舊版 SPA | ⭐ 不建議使用 |

OAuth 2.0 vs OpenID Connect (OIDC)

| 比較 | OAuth 2.0 | OpenID Connect | |------|:---------:|:--------------:| | 目的 | 授權(讓我存取你的資料) | 驗證(證明你是誰) | | Token 類型 | Access Token | ID Token (JWT) + Access Token | | Scope | api:read | openid profile email | | 回應格式 | 不固定 | 標準化的 JWT |

OAuth 2.0 常見誤解

| 誤解 | 正解 | |------|------| | OAuth 是登入系統 | OAuth 是授權機制,不是身分驗證 | | 使用 OAuth 就不需 HTTPS | HTTPS 是必要的(保護 Token) | | Implicit Flow 更快更安全 | Implicit 已棄用,應使用 PKCE | | Access Token 可以永久有效 | Token 應有失效時間,搭配 Refresh Token |



OAuth 2.0 不是登入,是授權

這是最常見的誤解。OAuth 2.0 是一個授權框架 (Authorization Framework),而不是認證協定。

| 你以為 | 實際上 | |:------:|:------:| | 「我用 Google 登入」→ 這是認證 | 背後使用的是 OpenID Connect (OIDC) | | 「Google 允許網站讀取我的 Email」→ 這是授權 | 這才是 OAuth 2.0 在做的事 |

OAuth 2.0 + OIDC 的關係

  • OAuth 2.0 定義了 Token 的發放流程(Authorization Code、PKCE 等)
  • OIDC 在 OAuth 2.0 之上增加了 ID Token(JWT 格式),用來驗證使用者身分
  • 所以當你看到「用 Google 登入」,實際上是「用 OAuth 2.0 + OIDC 登入」

四種授權流程的使用場景

| 流程 | 適合 | 原因 | |:----:|:----:|:----:| | Authorization Code | 有後端的傳統網頁應用(Next.js、Rails) | 可以在後端安全地儲存 Client Secret | | Authorization Code + PKCE | SPA、手機 App | 沒有後端或無法安全儲存 Secret | | Client Credentials | 機器對機器(M2M API) | 沒有使用者參與,只有應用程式本身 | | Device Code | 智慧電視、IoT 裝置 | 裝置沒有方便的輸入方式 |

下一章預告:從協定到實作

了解 OAuth 2.0 和 OIDC 的原理之後,下一章將進入 RBAC 與 ABAC——當你有了使用者身分之後,你要怎麼控制他們能存取什麼?

會員專屬免費教學

本章節為註冊會員專屬的免費開放內容!請先登入或註冊會員,即可立即解鎖閱讀。

立即登入 / 註冊