Project 6 - 令牌撤销与单点登出

实验目标 恭喜你来到最后一个实验!本周我们将实现 OAuth 2.0 系统的收尾工作:令牌撤销和单点登出。完成本实验后,你将能够: ✅ 理解令牌撤销的重要性和应用场景 ✅ 实现符合 RFC 7009 的令牌撤销端点 ✅ 理解单点登出(Single Logout, SLO)的工作原理 ✅ 实现前端通道登出(Front-Channel Logout) ✅ 理解后端通道登出(Back-Channel Logout)的概念 ✅ 完成整个 OAuth 2.0 授权服务器的实现 实验任务 任务 1:完善令牌管理器的撤销逻辑 文件位置 smart-sso-server/src/main/java/com/smart/sso/server/token/LocalTokenManager.java 1.1 完善 remove 方法 @Override public void remove(String refreshToken) { // TODO 1: 获取令牌内容 // 提示:使用 refreshTokenCache.getIfPresent() 方法 // 思考:如果令牌不存在应该如何处理?(幂等性) // TODO 2: 从刷新令牌缓存中移除 // 提示:使用 refreshTokenCache.invalidate() 方法 // TODO 3: 移除关联的访问令牌 // 提示:从 TokenContent 中获取 accessToken // 注意:访问令牌可能为 null,需要判空 // TODO 4: 从 TGT 反向索引中移除 // 提示: // - 获取 TGT 和对应的令牌集合 // - 从集合中移除当前刷新令牌 // - 如果集合为空,清理整个 TGT 缓存条目 // - 否则更新缓存 // TODO 5: 记录日志 // 提示:记录刷新令牌和用户 ID(用于审计) } 设计提示: ...

August 12, 2025 · 5 min · Theme PaperMod

Project 5 - 令牌颁发与刷新令牌轮换

实验目标 本周是整个项目的核心部分!我们将实现 OAuth 2.0 的引擎:令牌管理系统。完成本实验后,你将能够: ✅ 理解访问令牌和刷新令牌的不同生命周期 ✅ 实现令牌的创建、验证和存储 ✅ 实现刷新令牌轮换(Refresh Token Rotation) ✅ 实现刷新令牌盗窃检测机制 ✅ 理解令牌家族(Token Family)的概念 ✅ 掌握令牌与 TGT 的关联管理 理论背景 1. 访问令牌 vs. 刷新令牌 1.1 核心区别 特性 访问令牌 (Access Token) 刷新令牌 (Refresh Token) 用途 访问受保护的 API 资源 获取新的访问令牌 生命周期 短(15 分钟) 长(30 天) 传输频率 每次 API 请求都携带 仅在刷新时使用 泄露风险 高(频繁传输) 低(使用频率低) 存储位置 客户端内存 安全存储(加密) 撤销成本 低(自动过期) 高(需要主动撤销) 1.2 为什么需要两种令牌? 安全与体验的平衡: 场景 1:仅使用访问令牌 问题:访问令牌过期后,用户必须重新登录 结果:用户体验差 ❌ 场景 2:访问令牌永不过期 问题:一旦泄露,攻击者可永久访问 结果:安全性差 ❌ 场景 3:访问令牌 + 刷新令牌 优势: - 访问令牌短期有效,降低泄露风险 ✅ - 刷新令牌长期有效,无需频繁登录 ✅ - 刷新令牌可追踪和撤销 ✅ 2. 刷新令牌轮换 (Refresh Token Rotation) 2.1 传统方法 vs. 轮换方法 传统方法(不推荐): ...

August 5, 2025 · 6 min · Theme PaperMod

Project 3 - 全局会话管理 (TGT)

实验目标 本周我们将实现单点登录的核心机制:**票据授予票据(TGT)**管理。完成本实验后,你将能够: ✅ 理解 TGT 在 SSO 系统中的关键作用 ✅ 使用缓存实现会话的创建、检索和移除 ✅ 实现基于 TTL 的会话自动过期机制 ✅ 实现滑动窗口过期策略(提升用户体验) ✅ 限制每个用户的并发会话数量(安全增强) ✅ 理解会话级联失效机制(为单点登出做准备) 理论背景 1. 什么是票据授予票据 (TGT)? 1.1 TGT 的定义 TGT(Ticket Granting Ticket)是 SSO 系统中的全局会话令牌,类似于传统 Web 应用中的 Session ID,但具有更强的安全性和跨应用能力。 关键特性: 唯一性:每个 TGT 对应一个用户会话 安全性:通常使用 UUID 或密码学随机数生成 时效性:具有明确的过期时间(如 30 分钟无操作) 跨域性:可在多个子应用间共享 1.2 TGT 在 OAuth 2.0 流程中的作用 用户首次登录流程: 1. 用户访问应用 A → 重定向到 SSO 登录页 2. 用户输入账号密码 → SSO 验证成功 3. SSO 创建 TGT → 将 TGT ID 写入浏览器 Cookie 4. SSO 颁发授权码 → 应用 A 获取访问令牌 用户再次访问应用 B(单点登录体现): 1. 用户访问应用 B → 重定向到 SSO 2. 浏览器自动携带 TGT Cookie → SSO 验证 TGT 有效 3. SSO 直接颁发授权码 → 应用 B 获取访问令牌 (无需用户再次输入密码!) 2. 会话管理策略 2.1 生存时间 (TTL) 策略 固定过期时间: ...

July 22, 2025 · 4 min · Theme PaperMod

Project 1 - 环境搭建与系统设计

实验目标 本节主要完成以下任务: ✅ 搭建完整的 Java 开发环境 ✅ 配置 MySQL 数据库并初始化数据 ✅ 配置 Redis 缓存服务 ✅ 运行项目并验证环境正确性 ✅ 理解 OAuth 2.0 基本概念和系统整体设计 详细任务 一、环境搭建 1. 安装 JDK 17 步骤 下载 JDK 官方版本:Oracle JDK 17 开源版本:OpenJDK 17(推荐) 安装 JDK Windows: # 双击运行 .exe 文件,按提示完成安装 # 默认安装路径:C:\Program Files\Java\jdk-17 macOS: # 使用 Homebrew 安装(推荐) brew install openjdk@17 # 或下载 .dmg 文件手动安装 Linux (Ubuntu/Debian): sudo apt update sudo apt install openjdk-17-jdk Linux (CentOS/RHEL): sudo yum install java-17-openjdk-devel 配置环境变量 ...

July 8, 2025 · 5 min · Theme PaperMod

Project #0 - 实验准备

重要提醒 ⚠️ 请勿公开你的代码 - 本课程遵循学术诚信原则,代码仅供个人学习使用。 概述 本课程所有代码基于 Java 编写。在开始项目之前,请确保你具备以下基础: Java SE 基础:面向对象编程、集合框架、异常处理 Java Web 基础:Spring Boot、Spring MVC、RESTful API 数据库基础:SQL 基本操作、MyBatis 使用 缓存基础:Redis 基本概念和操作 本项目严格按照 OAuth 2.0 协议标准实现,主要基于授权码模式(Authorization Code Flow)。 必读材料 在开始实验前,请仔细阅读以下材料: OAuth 2.0 核心概念 理解OAuth 2.0 - 阮一峰的网络日志 RFC 6749 - The OAuth 2.0 Authorization Framework 授权码模式深入理解 重点关注:授权请求、授权响应、令牌请求、令牌响应的完整流程 安全增强特性 RFC 7009 - OAuth 2.0 Token Revocation RFC 7636 - Proof Key for Code Exchange (PKCE) 你的任务 本实验采用**“完形填空”**的形式: 理解项目架构:阅读提供的框架代码,理解各模块的职责 完成关键函数:在标记了 // TODO 的地方实现核心逻辑 通过单元测试:每个实验都配有 JUnit 测试用例 手动测试验证:使用 Postman 或其他工具进行端到端测试 实验评估方式 自动化测试:每个模块都有对应的单元测试(约 60%) 功能验证:手动测试关键流程(约 30%) 代码质量:代码规范性和安全性(约 10%) 重要提醒:本项目没有完全自动化的评分系统,请以学到知识为目标,诚信完成实验。 ...

June 22, 2025 · 2 min · Theme PaperMod