最新因為 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) 這絶對是可以完全照著流程實作就可以 !