成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實戰干貨:OAuth2授權請求是如何構建并執行的

系統
在Spring Security 實戰干貨:客戶端OAuth2授權請求的入口中我們找到了攔截OAuth2授權請求入口/oauth2/authorization的過濾器OAuth2AuthorizationRequestRedirectFilter,并找到了真正發起OAuth2授權請求的方法sendRedirectForAuthorization。但是這個方法并沒有細說,所以今天接著上一篇把這個坑給補上。

 

在Spring Security 實戰干貨:客戶端OAuth2授權請求的入口中我們找到了攔截OAuth2授權請求入口/oauth2/authorization的過濾器OAuth2AuthorizationRequestRedirectFilter,并找到了真正發起OAuth2授權請求的方法sendRedirectForAuthorization。但是這個方法并沒有細說,所以今天接著上一篇把這個坑給補上。

2. sendRedirectForAuthorization

這個sendRedirectForAuthorization方法沒多少代碼,它的主要作用就是向第三方平臺進行授權重定向訪問。它所有的邏輯都和OAuth2AuthorizationRequest有關,因此我們對OAuth2AuthorizationRequest進行輕描淡寫是不行的,我們必須掌握OAuth2AuthorizationRequest是怎么來的,干嘛用的。

OAuth2AuthorizationRequestResolver

這就需要去分析解析類OAuth2AuthorizationRequestResolver,其核心方法有兩個重載,這里分析一個就夠了。

  1. @Override 
  2. public OAuth2AuthorizationRequest resolve(HttpServletRequest request) { 
  3.     // registrationId是通過uri路徑參數/oauth2/authorization/{registrationId}獲得的 
  4.    String registrationId = this.resolveRegistrationId(request); 
  5.     // 然后去請求對象request中提取keyaction的參數,默認值是login 
  6.    String redirectUriAction = getAction(request, "login"); 
  7.     // 然后進入根本的解析方法 
  8.    return resolve(request, registrationId, redirectUriAction); 
  9. 復制代碼 

上面方法里面的resolve(request, registrationId, redirectUriAction)方法才是最終從/oauth2/authorization提取OAuth2AuthorizationRequest的根本方法。代碼太多但是我盡量通俗易懂的來進行圖解。resolve方法會根據不同的授權方式(AuthorizationGrantType)來組裝不同的OAuth2AuthorizationRequest。

3. OAuth2AuthorizationRequest

接下來就是OAuth2.0協議的核心重中之重了,可能以后你定制化的參考就來自這里,這是圈起來要考的知識點。我會對OAuth2AuthorizationRequestResolver在各種授權方式下的OAuth2AuthorizationRequest對象的解析進行一個完全的總結歸納。大致分為以下兩部分:

3.1 由AuthorizationGrantType決定的

在不同AuthorizationGrantType下對OAuth2AuthorizationRequest的梳理。涉及到的成員變量有:

  • authorizationGrantType ,來自配置spring.security.client.registration.{registrationId}.authorizationGrantType。
  • responseType , 由authorizationGrantType 的值決定,參考下面的JSON。
  • additionalParameters,當authorizationGrantType值為authorization_code時需要額外的一些參數,參考下面JSON 。
  • attributes,不同的authorizationGrantType存在不同的屬性。

其中類似{registrationId} 的形式表示 {registrationId}是一個變量,例如 registrationId=gitee。

在OAuth2客戶端配置spring.security.client.registration.{registrationId}的前綴中有以下五種情況。

當 scope 不包含openid而且client-authentication-method不為none時上述四個參數:

  1.   "authorizationGrantType""authorization_code"
  2.   "responseType""code"
  3.   "additionalParameters": {}, 
  4.   "attributes": { 
  5.     "registration_id""{registrationId}" 
  6.   } 
  7. 復制代碼 

當 scope 包含openid而且client-authentication-method不為none時上述四個參數:

  1.   "authorizationGrantType""authorization_code"
  2.   "responseType""code"
  3.   "additionalParameters": { 
  4.     "nonce""{nonce}的Hash值" 
  5.   }, 
  6.   "attributes": { 
  7.     "registration_id""{registrationId}"
  8.     "nonce""{nonce}" 
  9.   } 

當 scope不包含openid而且client-authentication-method為none時上述四個參數:

  1.   "authorizationGrantType""authorization_code"
  2.   "responseType""code"
  3.   "additionalParameters": { 
  4.     "code_challenge""{codeVerifier}的Hash值"
  5.     // code_challenge_method 當不是SHA256可能沒有該key 
  6.     "code_challenge_method""S256(如果是SHA256算法的話)" 
  7.   }, 
  8.   "attributes": { 
  9.     "registration_id""{registrationId}"
  10.     "code_verifier""Base64生成的安全{codeVerifier}" 
  11.   } 

當 scope包含openid而且client-authentication-method為none時上述四個參數:

  1.   "authorizationGrantType""authorization_code"
  2.   "responseType""code"
  3.   "additionalParameters": { 
  4.     "code_challenge""{codeVerifier}的Hash值"
  5.     // code_challenge_method 當不是SHA256可能沒有該key 
  6.     "code_challenge_method""S256(如果是SHA256算法的話)"
  7.     "nonce""{nonce}的Hash值" 
  8.   }, 
  9.   "attributes": { 
  10.     "registration_id""{registrationId}"
  11.     "code_verifier""Base64生成的安全{codeVerifier}"
  12.     "nonce""{nonce}" 
  13.   } 

implicit下要簡單的多:

  1.   "authorizationGrantType""implicit"
  2.   "responseType""token"
  3.   "attributes": {} 

3.2 固定規則部分

上面是各種不同AuthorizationGrantType下的OAuth2AuthorizationRequest的成員變量個性化取值策略, 還有幾個參數的規則是固定的:

  • clientId 來自于配置,是第三方平臺給予我們的唯一標識。
  • authorizationUri來自于配置,用來構造向第三方發起的請求URL。
  • scopes 來自于配置,是第三方平臺給我們授權劃定的作用域,可以理解為角色。
  • state 自動生成的,為了防止csrf 攻擊。
  • authorizationRequestUri 向第三方平臺發起授權請求的,可以直接通過OAuth2AuthorizationRequest的構建類來設置或者通過上面的authorizationUri等參數來生成,稍后會把構造機制分析一波。
  • redirectUri 當OAuth2AuthorizationRequest被第三方平臺收到后,第三方平臺會回調這個URI來對授權請求進行相應,稍后也會來分析其機制。

authorizationRequestUri的構建機制

如果不顯式提供authorizationRequestUri就會通過OAuth2AuthorizationRequest中的

  • responseType
  • clientId
  • scopes
  • state
  • redirectUri
  • additionalParameters

 按照下面的規則進行拼接成authorizationUri的參數串,參數串的key和value都要進行URI編碼。

  1. authorizationUri?response_type={responseType.getValue()}&client_id={clientId}&scope={scopes元素一個字符間隔}&state={state}&redirect_uri={redirectUri}&{additionalParameter展開進行同樣規則的KV參數串} 

然后OAuth2AuthorizationRequestRedirectFilter負責重定向到authorizationRequestUri向第三方請求授權。

redirectUri

第三方收到響應會調用redirectUri,回調也是有一定默認規則的,它遵循{baseUrl}/{action}/oauth2/code/{registrationId}的路徑參數規則。

  • baseUrl 是從我們/oauth2/authorization請求中提取的基礎請求路徑。
  • action,有兩種默認值login、authorize ,當/oauth2/authorization請求中包含了action參數時會根據action的值進行填充。
  • registrationId 這個就不用多說了。

4. 總結

通過對OAuth2AuthorizationRequest請求對象的規則進行詳細分析,我們應該能大致的知道的過濾器OAuth2AuthorizationRequestRedirectFilter流程:

  1. 通過客戶端配置構建ClientRegistration,后續可以進行持久化。
  2. 攔截/oauth2/authorization請求并構造OAuth2AuthorizationRequest,然后重定向到authorizationRequestUri進行請求授權。
  3. 第三方通過redirect_uri進行相應。

那么Spring Security OAuth2如何對第三方的回調相應進行處理呢?關注:碼農小胖哥 為你揭曉這個答案。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2025-01-13 08:04:24

2021-11-15 13:58:00

服務器配置授權

2017-08-04 18:10:09

2025-06-26 04:11:00

SpringSecurityOAuth2

2013-05-02 14:13:44

Android開發OAuth2服務認證

2023-08-31 08:34:07

Users對象序列化

2022-11-16 14:02:44

2023-08-29 08:00:38

2022-05-13 15:15:18

服務器OAuth2控制臺

2021-08-29 23:33:44

OAuth2服務器Keycloak

2022-02-15 07:35:12

服務器KeycloakOAuth2

2022-04-11 07:34:46

OAuth2UAA節點

2022-06-29 08:37:11

授權碼模式底層

2021-08-02 12:50:45

sessiontokenJava

2025-04-29 09:07:21

2022-08-25 08:00:00

授權框架OAuth 2.0服務器

2021-02-04 09:18:20

服務器認證自定義

2014-09-24 11:47:41

微信企業號開發

2024-06-05 08:42:24

2024-12-06 07:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区二区三区在线观看 | 久久久久久国产精品免费 | 免费成人av网站 | 国产精品国产精品国产专区不卡 | 天天干狠狠 | av中文字幕在线观看 | 精品一区二区三区免费视频 | 亚洲精品一区二区三区在线 | 老司机精品福利视频 | 亚洲欧美bt | av一区二区三区四区 | 久久久精品网站 | 青草久久免费视频 | 成人二区| 中文字幕一区二区三区精彩视频 | 精品一区在线看 | 精品久久久久久久久久久院品网 | 毛片免费视频 | 黄视频免费 | 日韩一区二区三区在线 | 国产精品视频不卡 | 国内精品久久久久久 | 中文av在线播放 | 91久久精品日日躁夜夜躁欧美 | 日韩欧美国产不卡 | 色婷婷狠狠 | 久久小视频 | 中文字幕一级毛片视频 | 91免费看片 | 国内av在线 | 久久一本 | 欧美综合国产精品久久丁香 | 欧美中文字幕一区二区 | 久久精品国产久精国产 | 毛片一级片 | 日本一本视频 | 国产精品一区二区三区久久久 | 亚洲成在线观看 | 亚洲综合大片69999 | 精品久久久久久久久久 | 精品久久久久久亚洲精品 |