深入理解 OAuth 2-0:原理、流程與實踐
一、什麼是 OAuth 2.0
1. 什麼是 OAuth 2.0
OAuth 2.0 是一套關於授權的行業標準協議。
OAuth 2.0 允許用戶授權第三方應用訪問他們在另一個服務提供方上的數據,而無需分享他們的憑據(如用戶名、密碼)。
2. OAuth 2.0 應用場景
OAuth 2.0 的應用場景非常廣泛,包括但不限於:
-
第三方應用訪問用戶在其他服務上的信息,例如,一個應用通過 OAuth 2.0 訪問用戶在 github.com 上的數據。
-
第三方應用代表用戶執行操作,例如,一個郵件客戶端應用通過 OAuth 2.0 發送用戶的電子郵件。
-
第三方應用使用 OAuth 2.0 實現用戶的單點登錄,例如,用戶可以使用 Github 賬號登錄其他應用。
3. OAuth 2.0 的重要性
OAuth 2.0 的重要性主要體現在它以簡潔、易實現的解決方案,解決用戶數據訪問和分享的安全問題的。
- 在現代網絡環境中,用戶的數據通常分散在不同的網絡服務中,如何安全、有效地進行數據訪問和分享,是一個重要的問題。OAuth 2.0 提供了一種標準的解決方案,使得用戶可以控制哪些應用可以訪問他們的哪些數據,而無需將用戶名和密碼提供給第三方應用。
二、OAuth 2.0 基本概念
OAuth2.0 的運行流程中,會涉及到一些名詞、概念,熟悉這些名詞、概念有助於更好的理解 OAuth 2.0 機制
-
客戶端(Client):
請求訪問資源的第三方應用;客戶端可以是 Web 站點、App、設備等。
-
服務提供商(Service Provider):
服務提供商是指提供、存放資源的網絡服務,如 Google、Github 等;
-
資源所有者(Resource Owner):
資源所有者通常就是指用戶,他們擁有服務提供商上的資源。
-
授權服務器(Authorization Server):
授權服務器是服務提供商用於處理和發放訪問令牌的服務器。當用戶請求訪問資源時,需要先向授權服務器請求訪問令牌。
-
資源服務器(Resource Server):
資源服務器是服務提供商用於存儲和管理資源的服務器;當用戶擁有訪問令牌後,就可以向資源服務器請求訪問資源。
-
訪問令牌(Access Token):
訪問令牌是授權服務器發放給客戶端的一個憑證,表示客戶端有權訪問資源所有者的資源。訪問令牌有一定的有效期,過期後需要使用刷新令牌來獲取新的訪問令牌。
-
刷新令牌(Refresh Token):
刷新令牌是授權服務器在發放訪問令牌時一同發放的一個憑證,用於在訪問令牌過期後獲取新的訪問令牌。刷新令牌通常有較長的有效期,甚至可以設置爲永不過期。
-
用戶代理(User Agent):
通常指瀏覽器。
三、OAuth 2.0 的基本流程
RFC 6749 中定義了 OAuth 2.0 的運行流程
-
(A)客戶端(Client)向資源所有者(Resource Owner)請求資源授權。授權請求可以直接向資源所有者(Resource Owner)發起,不過最好是通過授權服務器(Authorization Server)間接發起。
-
(B) 客戶端(Client)得到資源所有者(Resoure Owner)的授權,這通常是一個憑據;授權的形式和憑據可以有不同的類型。RFC 6749 定義了四種主要的授權類型(下文進一步介紹)
-
(C)客戶端(Client)向授權服務器(Authorization Server)出示授權(來自 Resource Owenr 的)憑據進行身份認證;並申請用於訪問資源授權的訪問令牌(Access Token)
-
(D) 授權服務器(Authorization Server)對客戶端(Client)進行身份驗證並驗證授權授予,如果通過驗證,則頒發訪問令牌(Access Token)。
-
(E)客戶端(Client)通過向資源服務器(Resource Server)發起令牌(Access Token)驗證,請求被保護的資源。
-
(F)資源服務器(Resource Server) 驗證訪問令牌(Access Token);如果通過認證,則返回請求的資源。
四、四種授權模式
客戶端必須得到用戶的授權(前面的步驟 B),才能獲得訪問令牌(Access Token)。
OAuth 2.0 定義了四種授權方式。
-
授權碼模式(Authorization Code)
-
隱式授權模式(Implicit)
-
密碼模式(Resource Owner Password Credentials)
-
客戶端模式(Client Credentials)
1. 授權碼模式
授權碼模式是最常用的授權流程。也是功能最完整、流程最嚴密的授權模式。
下圖是授權碼模式中 OAuth 2.0 授權流程(上文 OAuth 2.0 的步驟 B)的展開
-
(A)Client 先將頁面重定向 Authorization Server 的授權頁;重定向是需要攜帶授權完畢後要重新打開的頁面(攜帶 RedirectURI)。
-
(B)Resource Owner 在授權也進行授權。
-
(C)授權後,Authorization Server 將頁面重定向會 Client 的頁面(在 A 步驟中指定的 RedirectURI)。同時會在 URI 中攜帶授權碼 Code。授權碼 Code 會經 UserAgent 最終傳遞給 Client 的後端。
-
(D)Client(後端)利用授權碼向 Authorization Server 請求訪問令牌(Access Token),這裏需要指定請求訪問的訪問 Scope 等信息。
-
(E)Authorization Server 校驗授權碼通過後,返回訪問令牌 Access Token 和刷新令牌 Refresh Token。
2. 隱式授權模式(Implicit)
隱式授權模式主要用於純前端應用,如 JavaScript SPA(單頁應用)。
在隱式授權模式中,不是向客戶端頒發授權碼,而是直接向客戶端頒發訪問令牌(作爲資源所有者授權的結果)。省去了頒發中間憑據(例如授權代碼)的過程。
-
(A)用戶代理(通常是瀏覽器)向認證服務器發送授權請求。這通常通過將用戶重定向到認證服務器的授權端點來完成,請求中包含了客戶端 ID、請求的權限範圍、重定向 URI 和狀態。
-
(B) 認證服務器對用戶進行身份驗證,通常是通過要求用戶輸入用戶名和密碼。認證服務器向用戶顯示一個授權頁面,讓用戶決定是否授予客戶端請求的權限。
-
(C)如果用戶同意授予權限,認證服務器將用戶代理重定向回客戶端的重定向 URI,並在重定向 URI 的片段部分(fragment)中包含訪問令牌和狀態。注意,由於這是在用戶代理中完成的,所以訪問令牌從未通過服務器端的應用代碼。
3. 密碼模式(Resource Owner Password Credentials)
密碼模式是一種較爲簡單的流程,用戶直接將用戶名和密碼提供給客戶端,客戶端使用這些信息向授權服務器請求訪問令牌。客戶端不得存儲密碼。
密碼模式主要用於信任級別較高的應用,如同一公司的不同產品。
-
(A) 用戶在客戶端應用中輸入他們的用戶名和密碼。
-
(B) 客戶端應用使用用戶提供的用戶名和密碼,以及自己的客戶端 ID 和客戶端密鑰,向認證服務器的令牌端點發送請求,請求獲取訪問令牌。
-
(C)認證服務器驗證用戶名和密碼,以及客戶端 ID 和客戶端密鑰。如果驗證成功,認證服務器將訪問令牌返回給客戶端應用。
4. 客戶端模式(Client Credentials)
客戶端模式主要用於沒有用戶參與的後端服務(如開放 API 的場景)。
-
(A)客戶端應用程序使用自己的客戶端 ID 和客戶端密鑰,向認證服務器的令牌端點發送請求,請求獲取訪問令牌。
-
(B) 認證服務器驗證客戶端 ID 和客戶端密鑰。如果驗證成功,認證服務器將訪問令牌返回給客戶端應用程序。
五、OAuth 2.0 的安全性考慮
-
重定向 URI 的安全性 重定向 URI 是客戶端接收授權碼和訪問令牌的地址。爲了防止攻擊者攔截這些敏感信息,重定向 URI 應該使用 HTTPS 協議。此外,授權服務器應該只接受預先註冊的重定向 URI,以防止攻擊者將用戶重定向到惡意網站。
-
訪問令牌的保護 訪問令牌是一個敏感的憑證,如果被攻擊者獲取,他們就可以訪問用戶的資源。因此,訪問令牌應該在所有傳輸過程中使用 HTTPS 協議進行加密,防止被竊聽。在存儲訪問令牌時,也應該使用適當的加密措施進行保護。
-
刷新令牌的使用和保護 刷新令牌通常有較長的有效期,甚至可以設置爲永不過期。因此,如果刷新令牌被攻擊者獲取,他們就可以持續訪問用戶的資源。爲了防止這種情況,刷新令牌應該只在後端服務中使用,不應該暴露給前端應用。此外,刷新令牌也應該在所有傳輸和存儲過程中進行加密保護。
-
CSRF 攻擊和防範 CSRF(跨站請求僞造)是一種常見的網絡攻擊,攻擊者通過僞造用戶的請求來執行未經授權的操作。爲了防止 CSRF 攻擊,OAuth 2.0 的授權請求可以包含一個 state 參數,這是一個隨機生成的字符串,用於在授權服務器重定向回客戶端時驗證請求的合法性。客戶端在發送授權請求時生成 state 參數,並在接收授權響應時驗證它,如果不匹配,就拒絕響應。
六、OAuth 2.0 的實踐
1. 使用 OAuth 2.0 進行第三方登錄
第三方登錄是 OAuth 2.0 的一個常見應用場景。用戶可以使用他們在 Google,Facebook 等服務提供商上的賬號,直接登錄第三方應用,無需註冊新的賬號。這不僅提高了用戶體驗,也降低了用戶忘記密碼的風險。
2. 使用 OAuth 2.0 進行 API 授權
OAuth 2.0 也常用於 API 授權。例如,一個應用可以請求訪問用戶在 Google Drive 上的文件,或者請求發佈微博到用戶的 Twitter 賬號。在這些情況下,用戶可以使用 OAuth 2.0 授權應用訪問他們的資源,而無需將用戶名和密碼提供給應用。
3. 常見問題和解決方案
在實踐 OAuth 2.0 時,可能會遇到一些問題,例如重定向 URI 的匹配問題,訪問令牌的過期問題,刷新令牌的使用問題等。這些問題通常可以通過正確配置授權服務器和客戶端,以及遵循 OAuth 2.0 的最佳實踐來解決。例如,可以使用絕對匹配而不是模糊匹配來驗證重定向 URI,可以使用刷新令牌來獲取新的訪問令牌,而不是讓用戶重新登錄等。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/lAWgJ3oegR_edo-OqVjP0w