OAuth 2.0 資源伺服器

Spring Security 支援使用兩種 OAuth 2.0 Bearer Token 形式來保護端點

  • JWT

  • 不透明 Token

在應用程式將其授權管理委派給授權伺服器 (例如 Okta 或 Ping Identity) 的情況下,這非常方便。資源伺服器可以諮詢此授權伺服器以授權請求。

本節詳細說明 Spring Security 如何提供對 OAuth 2.0 Bearer Token 的支援。

JWT 和不透明 Token 的工作範例都可以在 Spring Security 範例儲存庫中找到。

現在我們可以考慮 Bearer Token 身份驗證如何在 Spring Security 中運作。首先,我們看到,與基本身份驗證一樣,WWW-Authenticate 標頭會傳回給未經身份驗證的用戶端

bearerauthenticationentrypoint
圖 1. 發送 WWW-Authenticate 標頭

上圖建立在我們的 SecurityFilterChain 圖表之上。

number 1 首先,使用者向使用者未經授權的 /private 資源發出未經身份驗證的請求。

number 2 Spring Security 的 AuthorizationFilter 指出未經身份驗證的請求被拒絕,並拋出 AccessDeniedException

number 3 由於使用者未經身份驗證,ExceptionTranslationFilter 會啟動開始身份驗證。配置的 AuthenticationEntryPointBearerTokenAuthenticationEntryPoint 的實例,它會發送 WWW-Authenticate 標頭。RequestCache 通常是一個 NullRequestCache,它不會儲存請求,因為用戶端能夠重播它最初請求的請求。

當用戶端收到 WWW-Authenticate: Bearer 標頭時,它知道應該使用 bearer token 重試。下圖顯示了 bearer token 被處理的流程

bearertokenauthenticationfilter
圖 2. 驗證 Bearer Token

此圖建立在我們的 SecurityFilterChain 圖表之上。

number 1 當使用者提交他們的 bearer token 時,BearerTokenAuthenticationFilter 會建立一個 BearerTokenAuthenticationToken,這是一種 Authentication,方法是從 HttpServletRequest 中提取 token。

number 2 接下來,HttpServletRequest 會傳遞給 AuthenticationManagerResolver,後者會選擇 AuthenticationManagerBearerTokenAuthenticationToken 會傳遞到 AuthenticationManager 進行身份驗證。AuthenticationManager 的具體外觀取決於您是否配置了 JWT不透明 token

number 3 如果身份驗證失敗,則為失敗

  • SecurityContextHolder 會被清除。

  • AuthenticationEntryPoint 會被調用以觸發再次發送 WWW-Authenticate 標頭。

number 4 如果身份驗證成功,則為成功

  • Authentication 會在 SecurityContextHolder 上設定。

  • BearerTokenAuthenticationFilter 調用 FilterChain.doFilter(request,response) 以繼續執行應用程式邏輯的其餘部分。