日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?

發布時間:2025/3/12 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Token 一定要放在請求頭中嗎? 答案肯定是否定的,本文將從源碼的角度來分享一下 spring security oauth2 的解析過程,及其擴展點的應用場景。

Token 解析過程說明

當我們使用 spring security oauth2 時, 一般情況下需要把認證中心申請的 token 放在請求頭中請求目標接口,如下圖 ①

spring security oauth2 通過攔截器獲取此 token 完成令牌到當前用戶信息(UserDetails)的轉換。

OAuth2AuthenticationProcessingFilter.doFilter

public class OAuth2AuthenticationProcessingFilter{

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,

ServletException {

try {

// 1. 根據用戶請求解析令牌,組裝預登陸對象

Authentication authentication = tokenExtractor.extract(request);

if (authentication == null) {

// 若是預登陸狀態為空,把無狀態登錄清空

if (stateless && isAuthenticated()) {

SecurityContextHolder.clearContext();

}

}

else {

// 2. 根據token 來做真正的認證登錄 Provier

Authentication authResult = authenticationManager.authenticate(authentication);

// 3. 登錄成功邏輯

eventPublisher.publishAuthenticationSuccess(authResult);

SecurityContextHolder.getContext().setAuthentication(authResult);

}

}

catch (OAuth2Exception failed) {

// 異常通知邏輯 Spring Event

...

return;

}

chain.doFilter(request, response);

}

}

我們主要來關注第一步 根據用戶請求解析令牌,組裝預登陸對象

來看默認實現 BearerTokenExtractor

public class BearerTokenExtractor implements TokenExtractor {

@Override

public Authentication extract(HttpServletRequest request) {

// 1. 解析token

String tokenValue = extractToken(request);

if (tokenValue != null) {

// 2. 創建一個authentication 返回

PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(tokenValue, "");

return authentication;

}

return null;

}

protected String extractToken(HttpServletRequest request) {

// 1.1 優先從請求header 獲取token

String token = extractHeaderToken(request);

// 1.2 若是請求token 中沒有,則獲取請求參數中的 access_token 參數

if (token == null) {

token = request.getParameter(OAuth2AccessToken.ACCESS_TOKEN);

}

return token;

}

}

擴展點

豐富獲取 token 渠道,個性化處理.例如掘金的 X-Legacy-Token 而非必須是 Authorization

請求參數中攜帶 access_token 參數也能被正確解析處理

重寫 BearerTokenExtractor 解決,若請求攜帶 token 無論接口是否被設置 permitAll 都會被攔截判斷的問題

總結

以上是生活随笔為你收集整理的oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。