自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)戰(zhàn)干貨:OAuth2授權(quán)請(qǐng)求是如何構(gòu)建并執(zhí)行的

系統(tǒng)
在Spring Security 實(shí)戰(zhàn)干貨:客戶端OAuth2授權(quán)請(qǐng)求的入口中我們找到了攔截OAuth2授權(quán)請(qǐng)求入口/oauth2/authorization的過(guò)濾器OAuth2AuthorizationRequestRedirectFilter,并找到了真正發(fā)起OAuth2授權(quán)請(qǐng)求的方法sendRedirectForAuthorization。但是這個(gè)方法并沒(méi)有細(xì)說(shuō),所以今天接著上一篇把這個(gè)坑給補(bǔ)上。

 

在Spring Security 實(shí)戰(zhàn)干貨:客戶端OAuth2授權(quán)請(qǐng)求的入口中我們找到了攔截OAuth2授權(quán)請(qǐng)求入口/oauth2/authorization的過(guò)濾器OAuth2AuthorizationRequestRedirectFilter,并找到了真正發(fā)起OAuth2授權(quán)請(qǐng)求的方法sendRedirectForAuthorization。但是這個(gè)方法并沒(méi)有細(xì)說(shuō),所以今天接著上一篇把這個(gè)坑給補(bǔ)上。

2. sendRedirectForAuthorization

這個(gè)sendRedirectForAuthorization方法沒(méi)多少代碼,它的主要作用就是向第三方平臺(tái)進(jìn)行授權(quán)重定向訪問(wèn)。它所有的邏輯都和OAuth2AuthorizationRequest有關(guān),因此我們對(duì)OAuth2AuthorizationRequest進(jìn)行輕描淡寫(xiě)是不行的,我們必須掌握OAuth2AuthorizationRequest是怎么來(lái)的,干嘛用的。

OAuth2AuthorizationRequestResolver

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

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

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

3. OAuth2AuthorizationRequest

接下來(lái)就是OAuth2.0協(xié)議的核心重中之重了,可能以后你定制化的參考就來(lái)自這里,這是圈起來(lái)要考的知識(shí)點(diǎn)。我會(huì)對(duì)OAuth2AuthorizationRequestResolver在各種授權(quán)方式下的OAuth2AuthorizationRequest對(duì)象的解析進(jìn)行一個(gè)完全的總結(jié)歸納。大致分為以下兩部分:

3.1 由AuthorizationGrantType決定的

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

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

其中類(lèi)似{registrationId} 的形式表示 {registrationId}是一個(gè)變量,例如 registrationId=gitee。

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

當(dāng) scope 不包含openid而且client-authentication-method不為none時(shí)上述四個(gè)參數(shù):

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

當(dāng) scope 包含openid而且client-authentication-method不為none時(shí)上述四個(gè)參數(shù):

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

當(dāng) scope不包含openid而且client-authentication-method為none時(shí)上述四個(gè)參數(shù):

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

當(dāng) scope包含openid而且client-authentication-method為none時(shí)上述四個(gè)參數(shù):

  1.   "authorizationGrantType""authorization_code"
  2.   "responseType""code"
  3.   "additionalParameters": { 
  4.     "code_challenge""{codeVerifier}的Hash值"
  5.     // code_challenge_method 當(dāng)不是SHA256可能沒(méi)有該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下要簡(jiǎn)單的多:

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

3.2 固定規(guī)則部分

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

  • clientId 來(lái)自于配置,是第三方平臺(tái)給予我們的唯一標(biāo)識(shí)。
  • authorizationUri來(lái)自于配置,用來(lái)構(gòu)造向第三方發(fā)起的請(qǐng)求URL。
  • scopes 來(lái)自于配置,是第三方平臺(tái)給我們授權(quán)劃定的作用域,可以理解為角色。
  • state 自動(dòng)生成的,為了防止csrf 攻擊。
  • authorizationRequestUri 向第三方平臺(tái)發(fā)起授權(quán)請(qǐng)求的,可以直接通過(guò)OAuth2AuthorizationRequest的構(gòu)建類(lèi)來(lái)設(shè)置或者通過(guò)上面的authorizationUri等參數(shù)來(lái)生成,稍后會(huì)把構(gòu)造機(jī)制分析一波。
  • redirectUri 當(dāng)OAuth2AuthorizationRequest被第三方平臺(tái)收到后,第三方平臺(tái)會(huì)回調(diào)這個(gè)URI來(lái)對(duì)授權(quán)請(qǐng)求進(jìn)行相應(yīng),稍后也會(huì)來(lái)分析其機(jī)制。

authorizationRequestUri的構(gòu)建機(jī)制

如果不顯式提供authorizationRequestUri就會(huì)通過(guò)OAuth2AuthorizationRequest中的

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

 按照下面的規(guī)則進(jìn)行拼接成authorizationUri的參數(shù)串,參數(shù)串的key和value都要進(jìn)行URI編碼。

  1. authorizationUri?response_type={responseType.getValue()}&client_id={clientId}&scope={scopes元素一個(gè)字符間隔}&state={state}&redirect_uri={redirectUri}&{additionalParameter展開(kāi)進(jìn)行同樣規(guī)則的KV參數(shù)串} 

然后OAuth2AuthorizationRequestRedirectFilter負(fù)責(zé)重定向到authorizationRequestUri向第三方請(qǐng)求授權(quán)。

redirectUri

第三方收到響應(yīng)會(huì)調(diào)用redirectUri,回調(diào)也是有一定默認(rèn)規(guī)則的,它遵循{baseUrl}/{action}/oauth2/code/{registrationId}的路徑參數(shù)規(guī)則。

  • baseUrl 是從我們/oauth2/authorization請(qǐng)求中提取的基礎(chǔ)請(qǐng)求路徑。
  • action,有兩種默認(rèn)值login、authorize ,當(dāng)/oauth2/authorization請(qǐng)求中包含了action參數(shù)時(shí)會(huì)根據(jù)action的值進(jìn)行填充。
  • registrationId 這個(gè)就不用多說(shuō)了。

4. 總結(jié)

通過(guò)對(duì)OAuth2AuthorizationRequest請(qǐng)求對(duì)象的規(guī)則進(jìn)行詳細(xì)分析,我們應(yīng)該能大致的知道的過(guò)濾器OAuth2AuthorizationRequestRedirectFilter流程:

  1. 通過(guò)客戶端配置構(gòu)建ClientRegistration,后續(xù)可以進(jìn)行持久化。
  2. 攔截/oauth2/authorization請(qǐng)求并構(gòu)造OAuth2AuthorizationRequest,然后重定向到authorizationRequestUri進(jìn)行請(qǐng)求授權(quán)。
  3. 第三方通過(guò)redirect_uri進(jìn)行相應(yīng)。

那么Spring Security OAuth2如何對(duì)第三方的回調(diào)相應(yīng)進(jìn)行處理呢?關(guān)注:碼農(nóng)小胖哥 為你揭曉這個(gè)答案。

 

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2025-01-13 08:04:24

2021-11-15 13:58:00

服務(wù)器配置授權(quán)

2017-08-04 18:10:09

2013-05-02 14:13:44

Android開(kāi)發(fā)OAuth2服務(wù)認(rèn)證

2022-11-16 14:02:44

2022-05-13 15:15:18

服務(wù)器OAuth2控制臺(tái)

2023-08-31 08:34:07

Users對(duì)象序列化

2023-08-29 08:00:38

2021-08-29 23:33:44

OAuth2服務(wù)器Keycloak

2022-06-29 08:37:11

授權(quán)碼模式底層

2022-02-15 07:35:12

服務(wù)器KeycloakOAuth2

2022-04-11 07:34:46

OAuth2UAA節(jié)點(diǎn)

2021-08-02 12:50:45

sessiontokenJava

2025-04-29 09:07:21

2022-08-25 08:00:00

授權(quán)框架OAuth 2.0服務(wù)器

2021-02-04 09:18:20

服務(wù)器認(rèn)證自定義

2014-09-24 11:47:41

微信企業(yè)號(hào)開(kāi)發(fā)

2024-06-05 08:42:24

2024-12-06 07:00:00

2024-03-01 11:33:31

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)