日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前言

截止到現在,一一哥 已經帶各位把Spring Security中的主要功能學完了,并且剖析了這些內容的底層實現原理,希望你可以有所收獲。

但是在安全認證領域,還有另一種很重要的授權機制---OAuth2.0開放授權。而且OAuth2.0開放授權與Spring Security經常配合使用,這兩者之間可以說是“焦不離孟,孟不離焦”的搭配關系,所以為了進一步掌握Spring Security,在這里 壹哥 給大家再介紹另一個OAuth2.0開放授權協議。

OAuth2.0開放授權并不是Spring Security框架里的一部分,只是兩者經常配合使用而已,所以我得先給大家普及一下OAuth2.0的內容,畢竟OAuth2.0的內容還是蠻難理解的。

一. OAuth2.0簡介

1. OAuth2.0概述

咱們先來看看在RFC6749號文件中對OAuth2.0的定義,如下圖所示:

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

簡單來說,OAuth2.0 是一種授權機制,其內部引入了一個授權層,可以分離兩種不同的角色:客戶端和資源所有者。資源所有者同意客戶端(第三方應用程序)的請求以后,資源服務器就可以向客戶端頒發短期的進入令牌(token),用來代替密碼,客戶端通過這個令牌,去請求有限的資源數據來使用。所以OAuth2.0 的核心就是向第三方應用頒發令牌。

2. OAuth2.0發展歷程

OAuth(Open Authorization)--開放授權,這是一種關于開放授權的協議標準。所謂的OAuth2.0,表示這是OAuth協議第2版,但并不兼容之前的OAuth1.0協議,即現在已經完全廢止了OAuth1.0協議。

那么為什么會廢止OAuth1.0協議呢?我們先來簡單說一下OAuth協議的發展歷程。

2007年12月的時候,OAuth協議已經誕生了,并與2010年4月份,被IETF(國際互聯網工程任務組)認可并作為認證授權的標準發布。但是這個OAuth1.0協議有些致命缺陷,就是它的簽名邏輯特別復雜,開發時對程序員來說極度惡心。而且OAuth1.0的授權流程是很單一,存在較大的漏洞,容易被黑客攻擊。所以在2012年10月的時候,IETF又更新發布了OAuth2.0協議,在這個版本中,放棄了之前復雜的數字簽名和加密方案,使用HTTPS來作為安全保障手段,這降低了程序員的開發難度。但是OAuth2.0協議與OAuth1.0協議互不兼容,所以現在我們進行開發時,都是采用OAuth2.0協議,而不再采用OAuth1.0協議。

3. OAuth2.0功能

通過上一小節,我們了解到OAuth是一種關于開放授權的協議,該協議其實是一個 服務提供商 授權 第三方應用 獲取 資源所有者 部分訪問權限 的授權機制。通俗的說,就是OAuth協議允許用戶在不提供密碼給第三方應用的情況下,使得第三方應用有權獲取用戶數據等基本信息。在整個授權過程中,第三方應用都不必獲取用戶的密碼,就可以取得用戶部分資源的使用權限,所以OAuth是一種安全開發的協議。

比如我們在CSDN上進行登錄時,可以利用CSDN這個平臺自身注冊的賬號,也可以使用第三方賬號(QQ、微信、微博等)來進行登錄,如下圖:

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

比如我們選擇利用QQ賬號登錄CSDN,如下圖:

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

這時候我們可以打開QQ掃碼,或者點擊自己的QQ頭像,就可以實現利用QQ帳號登錄到CSDN這個網站上。在這個過程中,我們其實不必擔心自己的QQ密碼會泄露給CSDN,因為CSDN是拿不到我們的QQ密碼的。

在這個登錄過程中,CSDN相對于QQ來說是第三方應用,QQ就是服務提供商。在QQ內部,會有一個認證服務器作為專門的授權中心,QQ用戶的用戶名頭像等信息都屬于資源,這些資源可能會存放在一臺專門的資源服務器上,也可能會直接存放在QQ的認證服務器上。當CSDN經過了QQ的認證之后,就可以獲取到QQ上的用戶昵稱、頭像、性別等信息,從而實現利用QQ的用戶,登錄到CSDN的網站上,免除用戶重復的注冊過程。

4. OAuth2.0使用場景

根據上一小節,我們可以總結一下OAuth2.0的使用場景,大致如下:

  • 第三方應用登錄:比如利用QQ,微博,微信授權登錄到其他網站或App。
  • 分布式或微服務項目中授權:在JAVA分布式或微服務開發時,后端業務拆分成若干服務,服務之間或前端進行請求調用時,為了安全認證,可以利用OAuth2.0進行認證授權。

二. OAuth2.0核心概念(重點)

1. 核心概念

另外從上面的章節中,我們也了解到OAuth2.0的幾個核心概念,如下:

  • 客戶端/第三方應用: 獲取用戶信息,如果我們使用QQ賬號來登錄CSDN網站,這時候CSDN相對于QQ來說就是第三方應用,或者成為是QQ的客戶端。
  • 服務提供商: 對外提供請求的服務器,比如上面說的QQ。
  • Resource Owner:資源所有(擁有)者,首先我們要明確“資源”的含義,“資源”是指我們請求的各種URL接口及各種數據,這里的資源所有者,也就是登錄用戶。
  • Authorization Server:認證服務器,即服務提供商(比如QQ)專門用來處理認證的服務器。
  • Resource Server:資源服務器,即服務提供商存放用戶資源的服務器。它與認證服務器,可以是同一臺服務器,也可以是不同的服務器。
  • Access token: 訪問令牌,供客戶端用來請求Resource Server(API)的資源,Access token通常是short-lived短暫的。

2. 令牌與密碼

在OAuth2.0中,提到了一個令牌的概念,那么令牌是什么?與我們平常所用的密碼又有什么區別?其實OAuth中的令牌(token)與密碼(password)作用是一樣的,都可以控制用戶是否可以進入系統,但是有幾點不同。

  • 令牌是短期的,到期后會自動失效,用戶自己無法修改;密碼一般是長期有效的,用戶不修改,就不會發生變化。
  • 令牌可以被資源所有者撤銷,立即失效;密碼一般不允許被他人撤銷。
  • 令牌有一定的授權范圍(scope),密碼一般是完整權限。

注意:

令牌的出現,既可以讓第三方應用獲得權限,同時又可以隨時可控,不會危及系統安全。但是只要知道了令牌,就能進入系統,系統一般不會再次確認身份,所以令牌必須保密,泄漏令牌與泄漏密碼的后果是一樣的。這也是為什么令牌的有效期,一般都設置得很短的原因。

三. OAuth2.0授權流程(重點)

了解完OAuth2.0中的各種基本概念之后,我們需要弄清楚OAuth2.0的授權流程,這樣后面才能根據這個授權流程進行開發。

1. 授權流程概述

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

OAuth 2.0的運行流程如下圖,摘自RFC 6749。

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

我們這里以QQ賬號登錄CSDN網站為例,給大家說一下OAuth2.0的授權執行流程:

(A). 某個用戶(資源擁有者)打開CSDN(客戶端)網站以后,CSDN(客戶端)要求用戶(資源擁有者)給予授權;
(B). 如果用戶(資源擁有者)同意,就給予CSDN(客戶端)授權;
(C). CSDN(客戶端)使用上一步獲得的授權,向QQ的認證授權服務器申請訪問令牌Access Token;
(D). QQ的認證授權服務器對CSDN(客戶端)進行認證,確認無誤后,同意發放訪問令牌Access Token;
(E). CSDN(客戶端)使用訪問令牌,向QQ的資源服務器申請獲取某些受保護的資源;
(F). QQ的資源服務器確認訪問令牌無誤后,同意向CSDN(客戶端)開放受保護的資源。

2. 授權流程詳解

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

第一步:在CSDN官網點擊選擇QQ登錄

當我們點擊選擇QQ登錄的圖標時,實際上是向CSDN服務器發起了一個

https://graph.qq.com/oauth2.0/show?which=Login&display=pc...&response_type=code&redirect_uri=https....passport.csdn.netogin%3FpcAuth...Type=qq的請求,CSDN服務器會響應一個302重定向地址,指向QQ授權登錄。這次訪問會攜帶一個pcAuthCallback,以便QQ那邊授權成功后,再次讓瀏覽器發起對這個callback的請求,這樣QQ就知道授權后要返回到哪個頁面。

第二步:跳轉到QQ登錄頁面輸入用戶名密碼,然后點授權并登錄

接著瀏覽器跳轉到重定向地址并訪問 http://www.qq.com/authorize?callback=https://yiyige.blog.csdn.net/,QQ的服務器接受到了CSDN訪問的authorize,并跳轉到QQ的登錄頁面。在用戶輸入賬號密碼點擊授權并點擊登錄按鈕后,QQ的認證服務器會對用戶信息進行認證,若校驗成功,該方法會響應瀏覽器一個重定向地址,并附上一個code(授權碼)

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

第三步:跳回到CSDN頁面,登錄成功

這一步背后的過程其實是最繁瑣的,但對于用戶來說是完全感知不到的。

授權QQ服務器在判斷登錄成功后,使頁面重定向到之前CSDN發來的callback地址并附上code授權碼,接著會跳轉到QQ的認證服務器發起一個新的請求,獲取到AccessToken令牌。獲取token成功后,CSDN服務器會用拿到的token換取用戶信息,最后將用戶信息儲存起來,并返回給瀏覽器其首頁的視圖,到此OAuth2.0授權結束。

四. OAuth2.0授權方式(重點)

講解完了OAuth2.0的授權流程,接下來壹哥再給大家介紹另一個重要概念,即OAuth2.0的授權方式。

在RFC 6749標準中定義了獲得令牌的四種授權方式(authorization grant),即 OAuth2.0 有四種獲得令牌的方式,我們開發時可以選擇最適合自己的那一種,向第三方應用頒發令牌,這四種授權方式如下:

  • 授權碼模式(authorization code)
  • 簡化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)

1. 授權碼模式

授權碼模式(authorization code),指的是第三方應用先申請一個授權碼,然后再用該授權碼獲取訪問令牌的方式。這種方式是功能最完整、流程最嚴密的授權模式,也是開發時最常用,安全性最高的授權模式,適用于那些有后端的 Web 應用,比如我們前面介紹的以QQ信息登錄到CSDN網站上就是采用授權碼模式。授權碼由前端發起申請,令牌則儲存在后端,而且所有與資源服務器的通信都在后端完成,這樣前后端分離,可以避免令牌泄漏。授權碼模式執行流程可以分為如下4步:

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

接下來我把這4步再分開詳細說明一下。

(1). 用戶請求客戶端A,

由客戶端A將用戶導向認證服務器B請求授權碼,假設用戶同意授權,認證服務器B會將用戶導向客戶端A事先指定的"重定向URI"(redirection URI),同時附上一個授權碼。

https://b.com/oauth/authorize?
  response_type=code&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read

比如我們前面利用QQ進行登錄到CSDN網站時,獲取code授權碼的url:

https://graph.qq.com/oauth2.0/show?which=Login
    &display=pc
    &client_id=100270988899
    &response_type=code
    &redirect_uri=https://passport.csdn.net/account/login?pcAuthType=qq
    &state=test
  • response_type:授權類型,必選項,為固定值code;
  • client_id: 客戶端id,必選項,表示告訴 認證服務器B 是誰在發起請求;
  • redirect_uri:可選項,是 認證服務器B 接受或拒絕請求后的回調網址;
  • scope:可選項,表示要求的授權范圍(這里是只讀);
  • state: 客戶端狀態。

(2). 客戶端A收到授權碼code,

附上之前的"重定向URI"參數,向認證服務器B申請令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向頁面鏈接,請求成功后返回code授權碼,一般有效時間是10分鐘。

https://a.com/callback?code=AUTHORIZATION_CODE

(3). 客戶端A向認證服務器B發起申請令牌的請求,

B會核對授權碼和重定向URI,確認無誤后,向客戶端A返回訪問令牌(access token)和更新令牌(refresh token),POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向頁面鏈接。

https://b.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL

(4). 認證服務器B 收到請求以后,

就會頒發令牌,向redirect_uri指定的網址,發送一段 JSON 數據:

{    
  "access_token":"ACCESS_TOKEN",
  "token_type":"bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "uid":100101,
  "info":{...}
}

2. 簡化模式

簡化模式(implicit grant type),有些 Web 應用只有前端,沒有后端,這時就只能將令牌儲存在前端瀏覽器中。所以在RFC 6749中還規定了第二種授權方式,允許直接向前端頒發令牌,因為是直接在瀏覽器中向認證服務器申請令牌,跳過了"授權碼"這個步驟,所以稱為 "隱藏(授權碼)式implicit",或者被稱為隱式授權模式。

隱式授權模式的客戶端一般是指用戶瀏覽器,訪問令牌通過重定向的方式傳遞到用戶瀏覽器中,再通過瀏覽器的JavaScript代碼來獲取訪問令牌。這種授權方式的所有步驟都是在瀏覽器中完成,沒有通過第三方應用程序的服務器,訪問令牌直接暴露在瀏覽器端,令牌對訪問者是可見的,且客戶端不需要認證,所以可能會導致訪問令牌被黑客獲取。該模式適用于對安全性要求不高的應用中,僅適用于需要臨時訪問的場景。

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

流程步驟:

(A). 客戶端將用戶導向認證服務器;
(B). 用戶決定是否給于客戶端授權;
(C). 假設用戶給予授權,認證服務器將用戶導向客戶端指定的"重定向URI",并在URI的Hash部分包含了訪問令牌;
(D). 瀏覽器向資源服務器發出請求,其中不包括上一步收到的Hash值;
(E). 資源服務器返回一個網頁,其中包含的代碼可以獲取Hash值中的令牌;
(F). 瀏覽器執行上一步獲得的腳本,提取出令牌;
(G). 瀏覽器將令牌發給客戶端。

請求URL:

GET /authorize?response_type=token&client_id=s6BhdRkqt3
    &state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb 
    
HTTP/1.1

Host: server.example.com 

與授權碼模式相比,用戶的登錄環節是一樣的,只是在授權成功之后的重定向上,授權碼模式是攜帶一個認證碼,由客戶端通過認證碼申請訪問令牌。而隱式授權模式則直接將訪問令牌作為URL的散列部分傳遞給瀏覽器,散列部分是專門用于指導瀏覽器行為的,比如瀏覽器頁面定位的錨點就可以由散列屬性來進行判定。

注意

簡化授權方式是把令牌直接傳遞給前端,這是很不安全的。因此,該授權方式適用于一些對安全性要求不高的場景,并且令牌的有效期必須非常短,通常是在會話期間(session)有效,當瀏覽器關掉,令牌就失效了。

3. 用戶名密碼模式

密碼模式(Resource Owner Password Credentials Grant),客戶端提供一個專用頁面,然后用戶向客戶端提供自己的用戶名和密碼,客戶端使用這些信息,向"服務提供商"索要授權。在這種模式中,用戶必須把自己的用戶名密碼給客戶端,但是客戶端不得存儲密碼。該授權模式適用于用戶對客戶端高度信任的情況下使用,一般不支持refresh token。

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

執行步驟:

(A). 用戶向客戶端提供用戶名和密碼;
(B). 客戶端將用戶名和密碼發給認證服務器,向后者請求令牌;
(C). 認證服務器確認無誤后,向客戶端提供訪問令牌;

響應信息:

POST /token HTTP/1.1 
Host: server.example.com      
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW      
Content-Type: application/x-www-form-urlencoded  
grant_type=password&username=johndoe&password=A3ddj3w

注意

用戶名密碼授權方式需要用戶給出自己的用戶名/密碼,顯然風險很大,因此只適用于其他授權方式都無法采用的情況,而且必須是用戶高度信任的應用。

4. 客戶端模式

客戶端模式,指客戶端以自己的名義,而不是以用戶的名義,向"服務提供商"發起認證。嚴格地說,客戶端模式并不屬于OAuth2.0框架所要解決的問題。在這種模式中,用戶直接向客戶端注冊,客戶端以自己的名義要求"服務提供商"提供服務,其實不存在授權問題。

客戶端授權模式通常是由客戶端提前向授權服務器申請應用公鑰、私鑰,并通過這些關鍵信息向授權服務器申請訪問令牌,從而得到資源服務器提供的資源,比如常見的微信公眾平臺、支付寶支付平臺授權等。該模式適用于沒有前端的命令行應用中,即在命令行下請求令牌。

贊!一文搞懂OAuth2.0授權協議是怎么回事

 

執行步驟:

(A). 客戶端向認證服務器發起身份認證,并要求一個訪問令牌;
(B). 認證服務器確認無誤后,向客戶端提供訪問令牌。

A步驟中,客戶端發出的HTTP請求,包含以下參數:

  • granttype:表示授權類型,此處的值固定為"clientcredentials",必選項。
  • scope:表示權限范圍,可選項。

響應信息:

POST /token HTTP/1.1
Host: server.example.com

Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials

#grant_type參數等于client_credentials表示采用憑證式,
#client_id和client_secret用來讓 B 確認 A 的身份

注意

這種方式給出的令牌,是針對第三方應用的,而不是針對用戶的,即有可能多個用戶共享同一個令牌。

希望通過本文的介紹,可以讓你對OAuth2.0協議有所掌握,后面我們可以把Spring Security與OAuth2.0結合,實現更靈活的認證授權。

若本文可以讓你有所收獲,請給壹哥點個贊吧!

分享到:
標簽:OAuth2
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定