資源服務器如何認證訪問身份?
一般會傳入access_token,那資源認證服務器是如何解析令牌以及如何與資源認證服務器的token庫進行對比的?
核心代碼在org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter#doFilter
Debug驗證:
1、先用密碼模式生成一個訪問的access_token
2、然后用postman進行資源請求:
3、進入斷點
圖1
(1):根據tokenExtractor的extract方法獲取請求攜帶的token信息
方法:org.springframework.security.oauth2.provider.authentication.BearerTokenExtractor#extractHeaderToken
經過:org.springframework.security.oauth2.provider.authentication.BearerTokenExtractor#extract
將token封裝成
PreAuthenticatedAuthenticationToken
這里可以看到PreAuthenticationAuthenticationToken是Authentication的子類,回到圖1的第一步,返回authentication對象
(2)、驗證authenticaion
圖1的第二步,進入斷點
從服務端的token存儲位置取出OAuth2AccessToken對象,這里tokenStore.readAccessToken(accessTokenValue)方法是核心,點進去看-》
就是從accessTokenStore中獲取的。
此時權限信息已經通過token取到,繼續往下驗證
checkClientDetails(auth)方法
驗證當前登錄用戶的scope屬性是否符合所請求的資源所需的權限要求,如果不滿足,拋出
Invalid token contains disallowed scope (" + scope + ") for this client
通過驗證后,將身份認證信息返回,第二步結束
(3):將身份信息綁定到SecurityContextHolder中
這步沒什么好說的,進入斷點就是
將身份信息設置到上下文的authentication屬性中。
至此,token的服務端驗證邏輯結束