OAuth 2.0 是一個業界標準的 **授權框架(authorization framework)**,用來讓應用程式安全地、有限地存取使用者在其他平台上的資源(像 Google、Facebook、GitHub 上的資料),而**不需要把密碼交給應用程式**。
---
## 🔑 OAuth 2.0 是做什麼的?
> 👥「使用者」允許「應用程式」存取「第三方服務」上的資料,而不需給密碼。
---
## 🎯 核心概念
| 名稱 | 說明 |
| ------------------------ | -------------------------------------------- |
| **Resource Owner** | 擁有資源的人,通常是「使用者」 |
| **Client** | 想要存取資源的應用程式(例如你的網站或手機 App) |
| **Authorization Server** | 驗證身份與發 token 的伺服器(例如 Google、GitHub) |
| **Resource Server** | 存放資源的伺服器(通常跟上面是同一個,例如 Google 的 userinfo API) |
| **Access Token** | 一組短期密鑰,Client 拿這個去存取資源 |
---
## 🔁 OAuth 2.0 授權流程(最常見:Authorization Code Flow)
### 📌 範例場景:
你做了一個網站,希望使用者能用 Google 登入並讀取他們的 email。
### 🔄 流程圖:
```
[User] → 點擊登入 → Redirect 到 Google Login
↓
[Google] → 使用者登入並同意授權
↓
[Google] → Redirect 回你的網站(附上授權碼)
↓
[你的網站] → 用授權碼換取 access token(向 Google)
↓
[你的網站] → 用 token 去取使用者 email/profile 等
```
---
## 🔐 Token 說明
| Token 類型 | 用途 | 壽命 |
| ----------------- | ----------------------- | ---------- |
| **Access Token** | 用來存取 API,像是取得使用者資料 | 短(幾分鐘~幾小時) |
| **Refresh Token** | 用來取得新的 Access Token(可選) | 長(幾天~幾週) |
---
## ✅ OAuth 2.0 的好處
* 不用暴露密碼給第三方應用
* 可細分權限(scope)
* 可撤銷授權
* 支援多種裝置(Web、Mobile)
---
## 🔧 常見流程類型(Grant Types)
| 類型 | 用途 | 適合場景 |
| ----------------------- | ----------------------- | --------------- |
| Authorization Code Flow | 最常用,安全,支援 Refresh Token | Web 後端應用 |
| PKCE(加強版) | 無需 secret,支援 SPA 安全授權 | 單頁前端應用(React 等) |
| Client Credentials Flow | 應用對應用授權(無使用者) | 後端系統整合、自動腳本 |
| Implicit Flow(已淘汰) | 舊的前端用法,已不建議使用 | ❌ 不建議 |
---
## 📘 實際應用範例
| 應用 | 使用 OAuth 來做什麼? |
| -------- | --------------------------------- |
| 登入(社群登入) | 用 Google/Facebook/GitHub 登入 |
| 存取 API | 第三方應用存取 Google Calendar、Dropbox 等 |
| 系統間授權 | 應用 A 與 B 授權共享資料(B2B 應用) |
---
## ❗️OAuth ≠ 身分驗證(Authentication)
OAuth 是「授權」(Authorization):我允許你存取資料
🔑 **要登入用戶身份,需結合 OpenID Connect(OIDC)**