---
# System prepended metadata

title: OAuth2.0

---

# OAuth2.0 

---

## Authentication VS Authorization

### Authentication
中文為驗證，主要做身份驗證確保使用者不是怪人，常在後端API設計中看見，下面舉個簡單直白例子

>例子
有一家發大財公司在一棟商辦大樓，而商辦大樓多人雜亂，所以公司在大門設置門禁卡，只有公司內部的人才有這張卡來進入公司，而卡片代表持卡人的身份驗證物品


### Authorization
中文為授權，主要賦予使用者權限，與前者不同在於服務認得這人但能控制他的權限，在API設計授權可看到使用者可用哪幾隻API，簡單舉例

>例子
發大財公司有小明與小花員工，小明為一般的後端工程師，小花為老闆的漂亮秘書，而小明的門禁卡無法進入老闆的辦公室，但小花身為老闆秘書可以進入老闆辦公室，小花倍授權可進入

## Credentials
有了前面授權與權限的知識後，來講講Credentials(憑證)，Credentials只用來證明如：

- 使用者

- 應用程式

- 設備


這三者的身份資料信息，Credentials會提供給Auth Service來做身分證明，作用於授權與權限身份驗證，常見的Credentials類型有：

- 帳號與密碼

- Token

- 指紋、臉部紋路

- OTP(SMS or Email verify code)

- API Key

- RFID卡



# OAuth2.0(Open Authorization)
OAuth2.0是一種開放標準協議，在不暴露用戶密碼的情況下，安全地訪問用戶的資源。常應用於第三方應用需要訪問用戶數據的情況，可以是網頁或者APP中進行存取私人資料方式，OAuth協議在第三方供應商與使用者帶來了以下好處：

- 增加使用者體驗，無需做繁瑣註冊尤其在APP應用程式達到非常好的效果
>例子：剛下載一個APP卻可用Google、Line、Facebook登入，增加使用者體驗

- 以第三方應用帶來用戶資料與提高用戶在第三方服務存留率
 >例子：當使用者用Google來登入APP應用程式，可以收集使用者一些私人資訊，並強化Google存留率，因為裝置已經與Google帳號做綁定

- 有利於第三方應用社交相關服務的推廣
    >例子：因為大多APP都可用Google登入，所以可能會讓使用者即使沒有Google帳號也會因要使用APP而註冊，同時Google能增加自己社群服務人數
 
OAuth 2.0 的推出是為了解決開發人員在使用 OAuth 1.0 時面臨的許多痛點，包括複雜的簽章和對非瀏覽器應用程式的支援不佳。

## Role
RFC 6749中，提到OAuth2.0有四個角色分別為：


- resource owner(可授權角色)
資源所有者決定是否授權某個第三方應用程式訪問他們的資源，其實就是指使用者
>例子：像是在APP用Google登入其他APP時會有是否要讓他人存取資源的彈窗

- resource server(第三方供應商)
客戶端通過 OAuth 2.0 流程，獲取並使用授權碼或令牌來訪問資源所有者的資源。
>例子：常見有Google、Meta、X保存使用者resource者

- client(應用程式)
    Client是請求訪問資源的應用程式，它是 OAuth 2.0 流程中的實際請求方。客戶端通常是代表資源所有者的第三方應用程式。

- authorization server
    authorization server負責驗證資源所有者的身份，並向Client發放authorization code 或存取Token 。它管理授權的過程。

| 角色               | 描述                                                         | 例子                                                         |
|--------------------|--------------------------------------------------------------|--------------------------------------------------------------|
| **Resource Owner**  | 資源所有者，通常是使用者，授權第三方應用程式訪問其受保護的資源。 | 使用者在 Google 登入時彈出的授權框，讓用戶選擇是否讓應用程式存取其 Google 帳號中的資料。 |
| **Resource Server** | 存儲和管理使用者資源的伺服器，並處理來自客戶端的授權請求。   | Google、Meta、X 等服務商提供的儲存使用者資料的伺服器。     |
| **Client**          | 代表資源所有者發送請求的應用程式，必須經過授權才能訪問資源。 | 一個第三方應用程式（例如日曆應用程式）希望訪問使用者的 Google 硬碟數據。 |
| **Authorization Server** | 驗證資源所有者並發行授權碼或存取令牌的伺服器。         | Google OAuth 伺服器，負責發行授權碼並交換為存取令牌。         |


## OAuth2 Authentication Flow
OAuth2 的身份驗證流程是一種機制，用於驗證使用者身分並授權應用程式存取使用者資源

整體流程流程(Authorization Code Grant)：

- 使用者存取客戶端，客戶端將使用者引導至Authorization Service。

- 使用者在Authorization Service登入並同意授權，授權伺服器返回授權碼（Authorization Code）給客戶端。

- 用戶端使用Authorization Code向Authorization Service請求Access Token(PKCE)。

- 授權伺服器Authorization Code並傳回access token。使用access token存取資源伺服器。
https://ithelp.ithome.com.tw/m/articles/10277215

以下以Google Dirver為例子，來講述OAuth2.0 Authentication Flow，實際Google OAuth2細節可能要參考Google官方document，這邊講述個大概OAuth2.0 Authentication Flow

1. Resource Onwer，進入Applaction的login頁面時，會顯示第三方登入Button，選擇登入的第三方login 將會從OAuth Service返回 login page


2. 返回login page Resource Owner會輸入帳號密碼或者其他登入方式進行登入，登入後會詢問資源consent page來同意授權，同意授權完後OAuth Service會return authentication code


3. 接著需要拿authentication code來交換accesstoken與refresh token


4. 取得access token 與refresh token後，就可以針對授權資源做操作了

![upload_93ac078a89824f0effaab09618bf9a39](https://hackmd.io/_uploads/HybmHYcwJx.png)



## Grant Types
OAuth 2.0定義了四種授權類型(Grant Types)，前文所提的是最常見的Authorization Code Grant，而每種適用於不同場景以及授權方式：

### Authorization Code Grant with PKCE
最常見Grant Types，也相較其他Grant Types安全性較好一點，因為通常會在後端做處理整個Authentication Flow取得Access Token，且對於取得Access Token透過Authorization Code來與OAuth Service來取得相較安全