最新因為 Project 需要的關係,所以要為原本的 Server Project 加入一個 OAuth2 的功能。

### OAuth2

RFC6749 詳細說明了 OAuth2 的概念 :  
https://tools.ietf.org/html/rfc6749

如果上面太難睇得明,可以睇下面這篇 :  
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2

### OAuth2 角色

OAuth定義了四個角色 :

-	資源所有者 (Resource Owner)
-	客戶 (Client)
-	資源服務器 (Resource Server)
-	授權服務器 (Authorization Server)

##### 資源所有者:用戶

資源所有者是授權應用程序訪問其帳戶的用戶。 該應用程序對用戶帳戶的訪問僅限於所授予授權的“範圍”(例如,讀取或寫入訪問權限)。

##### 資源/授權服務器:API

資源服務器託管受保護的用戶帳戶,授權服務器驗證用戶的身份,然後向應用程序頒發訪問令牌。

從應用程序開發人員的角度來看,服務的API既擔當資源角色又擔當授權服務器角色。 我們將把這兩個角色結合在一起,稱為服務或API角色。

##### 客戶:申請

客戶端是想要訪問用戶帳戶的應用程序。 在此之前,必須先由用戶授權,並且必須由API驗證授權。

### OAuth2 流程

1.	應用程序請求用戶授權訪問服務資源
2.	如果用戶授權了該請求,則應用程序將獲得授權
3.	應用程序通過提供其自身身份的身份驗證和授權授權,從授權服務器(API)請求訪問令牌 (access token)
4.	如果應用程序身份經過驗證並且授權授予有效,那麼授權服務器(API)會向該應用程序發出訪問令牌。 授權完成。
5.	該應用程序從資源服務器(API)請求資源,並提供用於身份驗證的訪問令牌
6.	如果訪問令牌有效,則資源服務器(API)將資源提供給應用程序

該過程的實際流程將根據所使用的授權授予類型而有所不同,但這是一般性的想法。

### 申請註冊

在對應用程序使用 OAuth 之前,您必須在服務中註冊應用程序。這是通過服務網站 “開發人員” 或 “ API” 部分中的註冊表格完成的,您將在其中提供以下信息(可能還包括有關您的應用程序的詳細信息):

-	應用名稱
-	申請網站
-	重定向 URI 或回調 URL

重定向 URI 是服務在用戶授權(或拒絕)您的應用程序後重定向用戶的位置,因此,應用程序中將處理授權代碼或訪問令牌的部分。

##### 客戶編號和客戶密碼

註冊您的應用程序後,該服務將以客戶端標識符和客戶端機密的形式發布“客戶端憑據”。客戶端 ID 是服務API用於標識應用程序的公開字符串,還用於構建提供給用戶的授權 URL。客戶密碼用於在應用程序請求訪問用戶帳戶時向服務 API 驗證應用程序的身份,並且必須在應用程序和 API 之間保持私密狀態。

### 授權

在上面的流程中,前四個步驟涉及獲得授權授權和訪問令牌。 授權授予類型取決於應用程序用於請求授權的方法以及 API 支持的授予類型。 OAuth2 定義了四種授權類型,每種類型在不同情況下都很有用:

-	授權代碼:與服務器端應用程序一起使用
-	隱式:與移動應用程序或Web應用程序(在用戶設備上運行的應用程序)一起使用
-	資源所有者密碼憑證:與受信任的應用程序一起使用,例如服務本身擁有的那些
-	客戶端憑據:與應用程序 API 訪問一起使用

### 實作

由於筆者 Project 現在需要的只是第三方 Server 部份要讀取現時 System 的使用者資料,所以這次只需要使用 "授權代碼" 方式授權就可解決問題了。

關於要如何實作 "授權代碼",可以直接參考 GOOGLE 自家的 OAuth2 方法

GOOGLE: [Using OAuth 2.0 for Web Server Applications](https://developers.google.com/identity/protocols/OAuth2WebServer)

這絶對是可以完全照著流程實作就可以 !
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)