歡迎閱讀 Spring Security 實戰乾貨 系列文章 。OAuth2.0 是近幾年比較流行的受權機制,對於普通用戶來講可能天天你都在用它,咱們常用的第三方登陸大都基於 OAuth2.0。隨着應用的互聯互通,個性化服務之間的相互調用,開放性的認證受權成爲 客觀的須要。html
OAuth定義了以下角色,並明確區分了它們各自的關注點,以確保快速構建一致性的受權服務:程序員
單純的文字性描述是否是有些難以理解。因此我這裏講一個親身經歷的事例來情景化以上的四個概念。立刻又到程序員集中面試的季節了,有一年我去面試,到了地方纔發現如此的「高大上」,訪客須要經過驗證碼才能經過閘門,因而我聯繫了面試公司的HR ,後面的流程大概是這樣的:面試
在我學習了 OAuth2.0 協議以後我發現此次經歷能夠體現出 OAuth2.0 的一些設計理念。訪客必須經過受權才能訪問大樓。這種方式避免了閒雜人等出入辦公場所,並且對訪客可控(從訪問時間和次數上),甚至能夠實現對樓層的訪問可控(固然上面的例子中沒有)。
再結合 OAuth2.0 能夠知道 訪客就是 Client,公司(業主)就是 Resource Owner,物業就是 Authorization Server ,那個閘機就是 Resource Server,閘機有可能也受到物業的管控。 這是那張著名的流程圖:spring
這個例子只是爲了快速的來認識 OAuth2.0 ,它是一種有效的、可靠的委託受權框架。它提供了多種受權模式在不一樣的場景下供你選擇。segmentfault
爲了得到訪問許可,客戶端須要向受權服務器出示有效的受權憑證,也就是說客戶端必須獲得用戶受權(authorization grant)OAuth2.0 提供了多種受權模式供開發者在不一樣的場景中使用,如下是受權模式的一些總結:後端
受權方式 | 客戶端類型/用例 |
---|---|
Authorization code | 旨在用於具備後端的傳統Web應用程序以及本機(移動或桌面)應用程序,以利用經過系統瀏覽器的單點登陸功能。 |
Implicit | 適用於不帶後端的基於瀏覽器的(JavaScript)應用程序。 |
Password | 對於應用程序和受權服務器屬於同一提供程序的受信任本機客戶端。 |
Client credentials | 客戶端以本身的名義來獲取許可,而不是以終端用戶名義,或者能夠說該用戶端也是資源擁有者 |
Refresh token | 令牌失效後使客戶端能夠刷新其訪問令牌,而沒必要再次執行代碼或 密碼授予的步驟。 |
SAML 2.0 bearer | 使擁有SAML 2.0斷言(登陸令牌)的客戶端將其交換爲OAuth 2.0訪問令牌。 |
JWT bearer | 擁有一個安全域中的JSON Web令牌斷言的客戶端將其交換爲另外一域中的OAuth 2.0訪問令牌。 |
Device code | 設備的惟一編碼,通常該編碼不可更改,多用於一些智能設備 |
Token exchange | 使用代理模擬的方式獲取令牌 |
其中前五種爲咱們所熟知。咱們後續會詳細介紹它們。瀏覽器
摘自《OAuth 2 實戰》:安全
因爲 OAuth2.0 被定義爲一個框架,對於 OAuth2.0 是什麼和不是什麼,一直未明確。咱們所說的 OAuth2.0 是指 OAuth2.0 核心規範中定義的協議, RFC 6749 核心規範詳述了一系列獲取訪問令牌的方法;還包括其伴隨規範中定義的 bearer 令牌, RFC 6750該規範規定了這種令牌的用法。獲取令牌和使用令牌這兩個環節是 OAuth2.0 的基本要素。正如咱們將在本節中看到的,在更普遍的 OAuth2.0 生態系統中存在不少其餘技術,它們配合 OAuth2.0 核心,提供更多 OAuth2.0 自己不能提供的功能。咱們認爲,這樣的生態系統是協議健康發展的體現,可是不該與協議自己混爲一談。
基於以上的原則 OAuth2.0 有如下一些要點須要明確被認識到:服務器
OAuth2.0 其實還有個特色,它並非單體協議。它被分紅了多個定義和流程,每一個定義和流程都有各自的應用場景。因此本文的目的在於場景化的引入 OAuth2.0,當你漸入佳境時,咱們再來進行細節的探討吧。若是你想知道更多關於 OAuth2.0 協議的相關知識,可關注公衆號:Felordcn 回覆 oauth 獲取相關知識的資料。框架
關注公衆號:Felordcn 獲取更多資訊