若依集成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.mzph.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;虚拟机硬盘扩容之前必…