若依集成BladeX單點登錄的令牌管理與api請求流程

在這里插入圖片描述

目錄

  1. 概述
  2. 系統架構
  3. 單點登錄流程
  4. 令牌管理機制
  5. 接口調用流程
  6. 關鍵代碼實現
  7. 數據結構
  8. 安全性考慮
  9. 常見問題與解決

概述

本文檔詳細說明若依系統如何實現與BladeX的單點登錄集成,包括令牌管理和接口調用的完整流程。整個集成采用基于OAuth2的授權碼流程,允許用戶通過BladeX賬號登錄若依系統,并使用BladeX令牌訪問BladeX的各類API。

系統架構

整個單點登錄與令牌管理系統主要包含以下組件:

前端組件

  • BladeCallback.vue:處理BladeX認證回調的前端頁面
  • /src/api/blade/apiTest.js:BladeX API封裝

后端服務

  • BladeAuthController:處理BladeX認證回調和token獲取
  • BladeApiController:提供BladeX API代理接口
  • BladeTokenManager:管理BladeX令牌的存儲和檢索
  • BladeApiClient:調用BladeX API的客戶端
  • BladeAuthUtil:提供BladeX認證工具方法

數據存儲

  • Redis:存儲BladeX令牌與若依用戶ID的映射關系

單點登錄流程

用戶瀏覽器 若依前端 BladeX認證服務 若依后端 若依Redis 1. 點擊"使用BladeX登錄" 2. 重定向到BladeX授權頁面 3. 呈現BladeX登錄界面 4. 提交BladeX賬號密碼 5. 授權成功,重定向回若依回調頁 6. 訪問回調頁面(/auth/blade-callback) 7. 發送授權碼(/blade/auth/getTokenInfo) 8. 使用授權碼換取訪問令牌 9. 返回BladeX訪問令牌和用戶信息 10. 查找對應的若依用戶 11. 保存BladeX令牌與用戶ID關聯 12. 創建若依JWT令牌 13. 返回若依JWT令牌 14. 保存JWT令牌并跳轉到首頁 用戶瀏覽器 若依前端 BladeX認證服務 若依后端 若依Redis

詳細步驟

  1. 發起BladeX授權:用戶在登錄頁點擊"使用BladeX登錄"按鈕,前端將用戶重定向到BladeX授權頁面。

  2. BladeX認證:用戶在BladeX系統中完成登錄和授權,BladeX認證服務生成授權碼并重定向回若依系統的回調URL。

  3. 處理授權回調

    • 前端:BladeCallback.vue組件接收授權碼,并調用后端接口
    • 后端:BladeAuthController.getTokenInfo方法處理授權碼
  4. 獲取BladeX令牌

    • BladeAuthUtil.getTokenByCode方法向BladeX認證服務發送請求,交換授權碼獲取訪問令牌
    • 解析響應,獲取訪問令牌、過期時間、用戶信息等
  5. 查找對應若依用戶

    • 根據BladeX返回的用戶名(account)或username在若依系統中查找對應用戶
    • 如未找到匹配用戶,返回錯誤信息
  6. 創建若依登錄會話

    • 使用與原生登錄完全相同的流程創建LoginUser對象
    • 記錄登錄IP和時間
    • 使用TokenService生成若依系統的JWT令牌
    • 保存登錄狀態到Redis
  7. 保存BladeX令牌

    • 使用BladeTokenManager將BladeX訪問令牌存入Redis
    • 將令牌與若依用戶ID建立映射關系
    • 設置與BladeX令牌相同的過期時間
  8. 返回登錄結果

    • 前端接收若依JWT令牌并保存
    • 獲取用戶信息和路由
    • 跳轉到系統首頁

令牌管理機制

BladeX令牌的管理由BladeTokenManager類負責,主要功能包括:

  1. 令牌保存

    • 將BladeX令牌信息封裝為BladeToken對象存儲在Redis中
    • 使用"blade_tokens:userId"作為Redis鍵名
    • 設置與BladeX原始令牌相同的過期時間
  2. 令牌獲取

    • 通過用戶ID快速檢索對應的BladeX令牌
    • 提供訪問令牌(access_token)的便捷獲取方法
  3. 令牌驗證

    • 檢查用戶是否擁有有效的BladeX令牌
    • 令牌自動隨Redis過期機制失效
  4. 令牌刪除

    • 在用戶登出或手動清除令牌時刪除Redis中的對應記錄

令牌數據結構

BladeToken類包含以下字段:

  • userId:若依系統用戶ID
  • userName:用戶名
  • accessToken:BladeX訪問令牌
  • loginTime:令牌獲取時間(毫秒時間戳)
  • expireTime:令牌過期時間(毫秒時間戳)

接口調用流程

若依前端 若依后端 BladeTokenManager 若依Redis BladeApiClient BladeX API服務 1. 調用若依系統API 2. 獲取用戶的BladeX令牌 3. 查詢Redis中的令牌 4. 返回BladeToken對象 5. 返回訪問令牌 6. 調用BladeX API 7. 構建請求頭 8. 發送API請求 9. 返回API響應 10. 返回處理結果 11. 響應前端請求 若依前端 若依后端 BladeTokenManager 若依Redis BladeApiClient BladeX API服務

詳細步驟

  1. 前端發起請求

    • 前端調用若依系統API,例如/blade/api/getUserInfo
  2. 獲取BladeX令牌

    • BladeApiControllerSecurityUtils獲取當前登錄用戶ID
    • 調用BladeTokenManager.getAccessToken(userId)獲取令牌
  3. 構建API請求

    • BladeApiClient負責構建請求并添加必要的請求頭
    • 添加"Blade-Auth: bearer {accessToken}"頭
    • 添加Basic認證頭用于API身份驗證
  4. 發送API請求

    • 使用RestTemplate發送HTTP請求到BladeX API
    • 處理各類響應和異常
  5. 錯誤處理

    • 當遇到401未授權響應時,識別為令牌過期
    • 提示用戶令牌已過期,需要重新登錄

關鍵代碼實現

保存BladeX令牌

// BladeAuthController.java
String accessToken = (String) tokenInfo.get("access_token");
Integer expiresIn = (Integer) tokenInfo.get("expires_in");
if (accessToken != null && expiresIn != null) {bladeTokenManager.setBladeToken(user.getUserId(), user.getUserName(), accessToken, expiresIn);log.info("成功保存用戶BladeX令牌, userId={}, expiresIn={}秒", user.getUserId(), expiresIn);
}

令牌保存實現

// BladeTokenManager.java
public void setBladeToken(Long userId, String userName, String accessToken, int expiresIn) {BladeToken bladeToken = new BladeToken();bladeToken.setUserId(userId);bladeToken.setUserName(userName);bladeToken.setAccessToken(accessToken);bladeToken.setLoginTime(System.currentTimeMillis());bladeToken.setExpireTime(bladeToken.getLoginTime() + expiresIn * 1000L);// 存儲到Redis,過期時間設置為令牌有效期String tokenKey = getTokenKey(userId);redisCache.setCacheObject(tokenKey, bladeToken, expiresIn, TimeUnit.SECONDS);
}

API調用示例

// BladeApiClient.java
public <T> T callBladeApi(Long userId, String url, HttpMethod method, Object requestBody, Class<T> responseType) {// 獲取用戶的訪問令牌String accessToken = tokenManager.getAccessToken(userId);if (StringUtils.isEmpty(accessToken)) {throw new ServiceException("用戶沒有有效的BladeX訪問令牌,請重新登錄");}// 構建請求頭HttpHeaders headers = new HttpHeaders();headers.set("Blade-Auth", "bearer " + accessToken);headers.set("Blade-Requested-With", "BladeHttpRequest");// 添加Basic認證String auth = clientId + ":" + clientSecret;byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);// 構建請求實體HttpEntity<?> requestEntity = new HttpEntity<>(requestBody, headers);// 發送請求并返回結果ResponseEntity<T> response = restTemplate.exchange(url, method, requestEntity, responseType);return response.getBody();
}

數據結構

配置參數

application.yml中配置BladeX相關參數:

blade:auth:# BladeX認證服務地址url: https://auth.we-safer.net/oauth/token# 客戶端IDclient-id: chem_ruoyi# 客戶端密鑰client-secret: chem_ruoyi_secret# 重定向URIredirect-uri: http://192.168.100.106:81/auth/blade-callbackapi:# BladeX API基礎地址base-url: https://we-safer.net/api

Redis存儲結構

BladeX令牌在Redis中的存儲格式:

  • 鍵名格式blade_tokens:userId
  • 值格式:序列化的BladeToken對象
  • 過期時間:與BladeX令牌過期時間一致(通常為7200秒)

安全性考慮

  1. 令牌安全存儲

    • BladeX令牌僅存儲在服務器端Redis中,不暴露給前端
    • 使用與BladeX原始令牌相同的過期時間,確保令牌及時失效
  2. 認證請求安全

    • BladeX認證請求使用HTTPS協議
    • 客戶端密鑰僅在服務器端使用,不暴露給前端
  3. 授權碼流程

    • 使用標準的OAuth2授權碼流程,提高安全性
    • 授權碼使用一次后立即失效
  4. 請求安全性

    • API調用添加Basic認證頭
    • 添加BladeX特定請求頭標識請求來源

常見問題與解決

  1. 用戶未找到問題

    • 問題:BladeX認證成功但未找到對應的若依用戶
    • 解決:確保在若依系統中創建與BladeX賬號同名的用戶
  2. 令牌過期問題

    • 問題:BladeX令牌過期導致API調用失敗
    • 解決:檢測到401錯誤時提示用戶重新登錄,自動跳轉到登錄頁
  3. 認證服務配置問題

    • 問題:未正確配置BladeX認證服務參數
    • 解決:檢查application.yml中的BladeX認證配置是否完整

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902143.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902143.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902143.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《AI大模型應知應會100篇》第27篇:模型溫度參數調節:控制創造性與確定性

第27篇&#xff1a;模型溫度參數調節&#xff1a;控制創造性與確定性 摘要 在大語言模型的使用中&#xff0c;“溫度”&#xff08;Temperature&#xff09;是一個關鍵參數&#xff0c;它決定了模型輸出的創造性和確定性之間的平衡。通過調整溫度參數&#xff0c;您可以根據任…

愛普生SG2520VGN差分晶振5G基站的時鐘解決方案

在 5G 通信時代&#xff0c;數據流量呈爆發式增長&#xff0c;5G 基站作為信號的核心中轉樞紐&#xff0c;承載著前所未有的數據傳輸與處理重任。從海量的物聯網設備連接&#xff0c;到高速移動用戶的數據交互&#xff0c;每一個環節都對基站的性能提出了嚴苛要求。而精準穩定的…

GitHub SSH連接終極解決方案

GitHub SSH連接終極解決方案&#xff1a;443端口修改多場景故障排查指南 一、問題現象速查 當開發者執行以下命令時出現連接異常&#xff1a; ssh -T gitgithub.com常見報錯類型&#xff1a; 經典端口阻塞ssh: connect to host github.com port 22: Connection refused密鑰驗…

面向新一代擴展現實(XR)應用的物聯網框架

中文標題&#xff1a; 面向新一代擴展現實&#xff08;XR&#xff09;應用的物聯網框架 英文標題&#xff1a; Towards an IoT Framework for the New Generation of XR Applications 作者信息 Joo A. Dias&#xff0c;UNIDCOM - IADE&#xff0c;歐洲大學&#xff0c;里斯本&…

Qt unknown module(s) in qt:serialport解決方法

在Ubuntu和CentOS系統中,若使用Qt時遇到Unknown module(s) in QT: serialport錯誤,通常是由于未正確安裝Qt的串口模塊(QSerialPort)或項目配置不當導致。以下是針對兩種系統的解決方案: 一、安裝Qt串口模塊 1. Ubuntu/Debian系列 安裝開發包: 執行以下命令安裝Qt5串口模…

閥門軸承電動車工件一鍵精修軟件

若需定制開發“ComfyUI意見精修軟件” 技術棧建議&#xff1a; 前端&#xff1a;React/Vue Figma插件API&#xff08;直接讀取設計稿&#xff09;。 后端&#xff1a;Node.js/Python NLP庫&#xff08;spaCy/NLTK&#xff09;。 數據庫&#xff1a;MongoDB&#xff08;存儲…

chapter32_SpringMVC與DispatcherServlet

一、簡介 從本章節開始進入SpringMVC的學習&#xff0c;SpringMVC最重要的類就是DispatcherServlet DispatcherServlet的本質是一個Servlet&#xff0c;回顧一下Servlet JavaWeb就是基于Servlet的Servlet接口有5個方法Servlet實現類是HttpServlet&#xff0c;自定義的Servle…

《Learning Langchain》閱讀筆記3-基于 Gemini 的 Langchain如何從LLMs中獲取特定格式

純文本輸出是有用的&#xff0c;但在某些情況下&#xff0c;我們需要 LLM 生成結構化輸出&#xff0c;即以機器可讀格式&#xff08;如 JSON、XML 或 CSV&#xff09;或甚至以編程語言&#xff08;如 Python 或 JavaScript&#xff09;生成的輸出。當我們打算將該輸出傳遞給其他…

中間件--ClickHouse-12--案例-1-日志分析和監控

1、案例背景 一家互聯網公司需要實時分析其服務器日志、應用日志和用戶行為日志&#xff0c;以快速發現潛在問題并優化系統性能。 2、需求分析 目標&#xff1a;實時分析日志數據&#xff0c;快速發現問題并優化系統性能。數據來源&#xff1a; 服務器日志&#xff1a;如 Ng…

多道程序和多任務操作系統區別

多道程序 vs. 多道任務&#xff1a;對比分析 ? 共同點 方面共同特征核心機制都依賴于進程/任務切換執行需求實現多個程序或任務"并發"執行系統支持都需要操作系統的支持&#xff08;如調度算法、內存管理&#xff09;本質目標提高資源利用率&#xff08;CPU不空轉…

齊次坐標變換+Unity矩陣變換

矩陣變換 變換&#xff08;transform)&#xff1a;指的是我們把一些數據&#xff0c;如點&#xff0c;方向向量甚至是顏色&#xff0c;通過某種方式&#xff08;矩陣運算&#xff09;&#xff0c;進行轉換的過程。 變換類型 線性變換&#xff1a;保留矢量加和標量乘的計算 f(x)…

閑來無事,用HTML+CSS+JS打造一個84鍵機械鍵盤模擬器

今天閑來無聊&#xff0c;突發奇想要用前端技術模擬一個機械鍵盤。說干就干&#xff0c;花了點時間搞出來了這么一個有模有樣的84鍵機械鍵盤模擬器。來看看效果吧&#xff01; 升級版的模擬器 屏幕錄制 2025-04-18 155308 是不是挺像那么回事的&#xff1f;哈哈&#xff01; 它…

智慧城市:如同為城市裝上智能大腦,開啟智慧生活

智慧城市的概念隨著信息技術的飛速發展而逐漸興起&#xff0c;它通過集成物聯網、大數據、人工智能和數字孿生等先進技術&#xff0c;為城市管理和居民生活帶來了前所未有的智能化變革。本文將深入探討這些核心技術及其在智慧城市的典型應用場景&#xff0c;展示智慧城市如何提…

科技快訊 | 智譜開源最新GLM模型系列;“AI 洗頭店”現身廣州;ChatGPT上線圖庫功能

智譜開源最新GLM模型系列&#xff0c;啟用全球域名“Z.ai” 4月15日&#xff0c;智譜開源最新GLM模型系列&#xff0c;包括32B和9B尺寸&#xff0c;涵蓋基座、推理、沉思三類模型&#xff0c;全部遵循MIT開源許可協議。推理模型GLM-Z1-32B-0414實測推理速度達200 tokens/秒&…

第32講:衛星遙感與深度學習融合 —— 讓地球“讀懂”算法的語言

目錄 ?? 一、講講“遙感+深度學習”到底是干啥的? ? 能解決什么問題? ?? 二、基礎原理串講:深度學習如何“看懂”遙感圖? ?? 遙感圖像數據類型: ?? CNN的基本思路: ?? 三、實戰案例:用CNN對遙感圖像做地類分類 ?? 所需R包: ??? 步驟一:構建訓…

【多線程5】面試常考鎖知識點

文章目錄 悲觀/樂觀鎖掛起等待鎖/自旋鎖偏向鎖輕量級/重量級鎖鎖升級CASCAS引發的ABA問題解決方案 原子類 公平/不公平鎖可重入鎖ReentrantLock讀寫鎖 Callable接口 這里的“悲觀”“樂觀”“掛起等待”“自旋”“輕量級”“重量級”“公平”“非公平”“可重入”僅代表某個鎖的…

第三屆世界科學智能大賽新能源賽道:新能源發電功率預測-數據處理心得體會1

看懂數據 比賽數據說明&#xff1a; 文檔&#xff08;報名之后可以下載&#xff09;大小操作初賽測試集.zip94MB下載初賽訓練集.zip632MB下載output.zip145KB下載 任務和主題 AI新能源功率預報&#xff1a;根據歷史發電功率數據和對應時段多類別氣象預測數據&#xff0c;實…

【云馨AI-大模型】2025年4月第三周AI領域全景觀察:硬件革命、生態博弈與國產化突圍

一、硬件算力突破點燃多智能體時代 谷歌在4月12日Cloud Next大會發布第七代TPU Ironwood&#xff0c;單芯片算力達4614 TFLOPs&#xff0c;較前代內存提升6倍&#xff0c;專為AI推理場景優化。配合發布的Gemini 2.5 Flash模型通過"思考"功能實現成本優化&#xff0c…

第3章 垃圾收集器與內存分配策略《深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版)》

第3章 垃圾收集器與內存分配策略 3.2 對象已死 Java世界中的所有對象實例&#xff0c;垃圾收集器進行回收前就是確定對象哪些是活著的&#xff0c;哪些已經死去。 3.2.1 引用計數算法 常見的回答是&#xff1a;給對象中添加一個引用計數器&#xff0c;有地方引用&#xff0…

超詳細VMware虛擬機擴容磁盤容量-無坑版

1.環境&#xff1a; 虛擬機&#xff1a;VMware Workstation 17 Pro-17.5.2 Linux系統&#xff1a;Ubuntu 22.04 LTS 2.硬盤容量 虛擬機當前硬盤容量180G -> 擴展至 300G 3.操作步驟 &#xff08;1&#xff09;在虛擬機關機的狀態下&#xff0c;虛擬機硬盤擴容之前必…