# HTTP 安全警告和令牌管理功能实现总结 ## 实现的功能 ### 1. 登录页 HTTP 安全警告 ✅ **文件**: `client/src/pages/LoginPage.tsx` **功能**: - 检测用户是否使用 HTTP 协议访问面板 - **首次访问时自动弹出安全警告模态框**(带淡入淡出动画) - **常驻显示"环境不安全"按钮**(左上角,带慢速脉冲动画) - 点击"环境不安全"按钮可随时查看安全警告详情 - 警告内容包括: - HTTP 访问的安全风险说明(数据传输未加密、凭证可能被截获等) - 安全建议(配置 HTTPS、仅在内网使用、定期更换密码等) - 安全配置限制提示 - 使用 localStorage 记录用户已确认首次警告 - 符合面板风格的弹窗设计 **关键代码**: ```typescript // 检测 HTTP 访问并显示安全警告(仅首次自动弹出) useEffect(() => { const isHttp = window.location.protocol === 'http:' const dismissed = localStorage.getItem('httpWarningDismissed') === 'true' if (isHttp) { setShowHttpWarning(true) if (!dismissed) { // 首次访问,延迟显示弹窗 const timer = setTimeout(() => { setHttpWarningDismissed(false) }, 500) return () => clearTimeout(timer) } else { // 已经确认过,不自动弹出 setHttpWarningDismissed(true) } } }, []) // 常驻的"环境不安全"按钮 {showHttpWarning && ( )} ``` ### 2. 设置页面安全配置限制 ✅ **文件**: `client/src/pages/SettingsPage.tsx` **功能**: - 检测当前访问协议(HTTP/HTTPS) - HTTP 访问时在安全配置区域显示醒目的警告横幅 - **HTTP 访问时的限制**: - 令牌到期时间:最大 24 小时(可修改,但不能超过 24) - 永不到期选项:禁用 - 令牌重置规则:可自由选择(启动时重置/过期自动重置) - 重置令牌按钮:可用 - **HTTPS 访问时无限制**: - 令牌到期时间:最大 8760 小时(1年) - 所有选项均可自由配置 - 尝试设置超过限制时显示友好的提示消息 - 显示当前访问环境的限制信息 **关键代码**: ```typescript const handleSecurityConfigChange = (updates) => { const newConfig = { ...securityConfig, ...updates } // HTTP 访问时限制最大 24 小时 if (isHttpAccess && updates.tokenExpireHours !== null && updates.tokenExpireHours !== undefined) { if (updates.tokenExpireHours > 24) { addNotification({ type: 'warning', title: '设置受限', message: 'HTTP 访问时令牌到期时间最大为 24 小时' }) newConfig.tokenExpireHours = 24 } } // HTTP 访问时禁止设置永不到期 if (isHttpAccess && updates.tokenExpireHours === null) { addNotification({ type: 'warning', title: '操作受限', message: 'HTTP 访问时不允许设置永不到期,请使用 HTTPS 访问' }) return } // ... 正常处理逻辑 } ``` ### 3. 重置令牌功能优化 ✅ **文件**: `server/src/routes/security.ts` **功能**: - **随时可用的令牌重置功能**(不再依赖重置规则) - 点击重置按钮立即重新生成 JWT 密钥 - 所有现有令牌立即失效 - 用户需要重新登录 - 记录操作日志 **关键代码**: ```typescript // 重置JWT密钥(随时可用) router.post('/reset-token', authenticateToken, async (req: Request, res: Response) => { try { // 重新生成JWT密钥,使所有现有令牌失效 await configManager.regenerateJWTSecret() logger.info('JWT密钥已手动重新生成,所有现有令牌已失效') res.json({ success: true, message: 'JWT密钥已重新生成,所有现有令牌将失效,请重新登录' }) } catch (error) { logger.error('重置令牌失败:', error) res.status(500).json({ success: false, message: '重置令牌失败' }) } }) ``` ### 4. 开发者工具强制修改令牌到期时间 ✅ **文件**: `client/src/modules/developer/components/DeveloperToolsPanel.tsx` **功能**: - 在开发者工具页面新增"强制修改令牌到期时间"功能 - 显示当前安全配置(重置规则、到期时间) - 允许开发者绕过 HTTP 限制强制修改令牌到期时间 - 包含醒目的警告提示,说明这是开发者专用功能 - 输入验证(1-8760 小时) - 实时更新配置并显示成功/失败消息 **关键代码**: ```typescript const handleForceUpdateTokenExpire = async () => { if (tokenExpireHours <= 0) { addNotification({ type: 'error', title: '输入错误', message: '令牌到期时间必须大于0' }) return } const result = await apiClient.updateSecurityConfig({ tokenResetRule: currentConfig?.tokenResetRule || 'expire', tokenExpireHours: tokenExpireHours }) // ... 处理结果 } ``` ## 技术实现细节 ### 协议检测 - 使用 `window.location.protocol` 检测访问协议 - 在组件挂载时执行检测 - 使用 React state 管理检测结果 ### 状态管理 - 登录页使用 localStorage 存储警告确认状态(持久化) - 设置页使用 React state 管理 HTTP 访问状态 - 开发者工具使用 API 获取实时配置 - HTTP 访问时自动触发安全配置强制更新 ### UI/UX 设计 - 所有弹窗都有淡入淡出动画(animate-fade-in/animate-fade-out) - "环境不安全"按钮带慢速脉冲动画(animate-pulse-slow) - 使用 Lucide React 图标库(AlertTriangle, Shield, Clock 等) - 遵循面板现有的设计风格(card-game, btn-game 等) - 颜色语义化:橙色表示警告,红色表示危险,蓝色表示信息 - 常驻按钮设计:固定在左上角,不遮挡主要内容 ### 安全考虑 - HTTP 访问时自动强制切换为 24 小时令牌重置模式 - HTTP 访问时禁用安全配置修改(除重置令牌外) - 重置令牌功能保持可用,方便紧急情况处理 - 开发者工具需要额外认证才能访问 - 所有 API 调用都需要认证令牌 - 提供清晰的安全风险说明和强制配置信息 ## 测试建议 ### 1. HTTP 访问测试 ```bash # 使用 HTTP 访问面板 http://localhost:3000/login ``` - 验证登录页首次访问时自动弹出安全警告 - 验证登录页左上角显示"环境不安全"按钮(带脉冲动画) - 验证点击"环境不安全"按钮可重新查看警告详情 - 验证设置页显示 HTTP 访问限制警告横幅 - **验证令牌重置规则可以自由选择** - **验证令牌到期时间可以修改(1-24 小时)** - **验证输入超过 24 小时会自动限制为 24 并提示** - **验证永不到期选项被禁用,点击时显示提示** - **验证重置令牌按钮可用,点击后所有令牌失效** ### 2. HTTPS 访问测试 ```bash # 使用 HTTPS 访问面板 https://localhost:3000/login ``` - 验证登录页不显示"环境不安全"按钮 - 验证登录页不自动弹出安全警告 - 验证设置页安全配置可正常修改 - 验证可以自由设置令牌重置规则和到期时间 - **验证令牌到期时间最大值为 8760 小时(1年)** - **验证重置令牌按钮可用,点击后所有令牌失效** ### 3. 令牌重置测试 - 在设置页点击"重置令牌"按钮 - 验证显示成功消息:"JWT密钥已重新生成,所有现有令牌将失效,请重新登录" - 验证当前会话立即失效 - 验证需要重新登录才能继续使用 - 验证其他已登录的会话也同时失效 ### 4. 开发者工具测试 - 访问开发者工具页面 - 验证可以查看当前安全配置 - 验证可以强制修改令牌到期时间 - 验证修改后配置立即生效 ### 5. 令牌到期测试 - 设置令牌到期时间为 1 小时 - 等待 1 小时后验证令牌自动失效 - 验证需要重新登录 ## 相关文件 ### 前端文件 - `client/src/pages/LoginPage.tsx` - 登录页(HTTP 警告 + 常驻按钮) - `client/src/pages/SettingsPage.tsx` - 设置页(安全配置限制 + 强制 24 小时重置) - `client/src/modules/developer/components/DeveloperToolsPanel.tsx` - 开发者工具(强制修改) - `client/src/utils/api.ts` - API 客户端(安全配置 API) - `client/src/index.css` - 样式文件(慢速脉冲动画) ### 后端文件 - `server/src/routes/security.ts` - 安全配置路由 - `server/src/modules/config/ConfigManager.ts` - 配置管理器 - `server/src/modules/auth/AuthManager.ts` - 认证管理器 ## 注意事项 1. **HTTP 警告仅在首次访问时自动弹出**,用户确认后会记录在 localStorage 中,但"环境不安全"按钮会常驻显示 2. **"环境不安全"按钮常驻在登录页左上角**,用户可随时点击查看安全警告详情 3. **HTTP 访问时自动强制切换为 24 小时令牌重置模式**,无需手动设置 4. **HTTP 访问时令牌到期时间最大 24 小时,HTTPS 访问时最大 8760 小时** 5. **设置页的限制是实时的**,切换协议后立即生效 6. **重置令牌功能随时可用**,不依赖重置规则,点击后立即使所有令牌失效 7. **重置令牌后需要重新登录**,包括当前会话和其他已登录的会话 8. **开发者工具需要额外认证**,确保只有授权用户可以访问 9. **令牌到期时间的修改会立即生效**,影响所有新生成的令牌 10. **慢速脉冲动画**通过 CSS keyframes 实现,3 秒一个周期 ## 后续优化建议 1. 添加 HTTPS 配置向导,帮助用户快速配置证书 2. 在系统信息中显示当前访问协议和安全状态 3. 添加令牌到期时间的历史记录 4. 支持多种令牌到期策略(按用户、按设备等) 5. 添加令牌使用情况的统计和监控 6. 支持自定义 HTTP 访问时的强制令牌到期时间(目前固定为 24 小时) 7. 添加访问协议切换的日志记录 ## 新增 CSS 动画 **文件**: `client/src/index.css` ```css /* 慢速脉冲动画 */ @keyframes pulse-slow { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } .animate-pulse-slow { animation: pulse-slow 3s ease-in-out infinite; } ``` 此动画用于"环境不安全"按钮,提供柔和的视觉提示效果。