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——當你有了使用者身分之後,你要怎麼控制他們能存取什麼?