Files
webs/power_leasing/✅ Token存储降级方案修复说明.md

105 lines
2.9 KiB
Markdown
Raw Normal View History

2026-01-09 17:13:29 +08:00
# ✅ Token 存储降级方案 - 修复说明
## 📌 问题描述
**现象:** 本地调试正常,但在其他电脑上登录后 `localStorage.leasToken` 没有存储成功。
**根本原因:** 项目使用了 AES-GCM 加密存储,依赖 Web Crypto API在 HTTP 环境或旧版浏览器中不可用。
## ✅ 修复方案
实现了**三层降级存储策略**,确保在任何环境下都能正常存储 token:
```
优先: AES-GCM 加密存储 (HTTPS + 现代浏览器)
↓ 失败自动降级
降级: 明文 JSON 存储 (HTTP 环境/旧浏览器)
↓ 失败保底
保底: 内存缓存 (至少当前会话可用)
```
## 🔧 修改的文件
**核心修复:**
- [src/utils/request.js](src/utils/request.js) - Token 管理逻辑
- `initTokenCache()` - 智能读取(加密→明文→内存)
- `updateToken()` - 智能存储(加密→明文→内存)
- `clearToken()` - 完全清除(加密+明文+内存)
## 📊 兼容性
| 环境 | 存储方式 | 状态 |
|------|----------|------|
| HTTPS + 现代浏览器 | ✅ AES-GCM 加密 | 最安全 |
| HTTP 环境 | ⚠️ 明文 JSON | 自动降级 |
| 旧版浏览器 (IE11/360兼容模式) | ⚠️ 明文 JSON | 自动降级 |
| 隐私模式 | 💾 内存缓存 | 会话内可用 |
## 🧪 验证方法
### 开发环境测试
```bash
npm run serve
```
登录后在浏览器控制台检查:
```javascript
// 检查是否存储成功
console.log('Token 已存储:', !!localStorage.getItem('leasToken'));
// 查看存储模式(开发环境会有日志)
// HTTPS: [Token缓存] ✅ 已保存到加密存储
// HTTP: [Token缓存] ✅ 已保存到明文存储(降级模式)
```
### 测试登录持久化
```javascript
// 1. 登录后刷新页面
location.reload();
// 2. 应该保持登录状态,不需要重新登录
```
### 在问题电脑上验证
1. 清除旧数据: `localStorage.clear()`
2. 重新登录
3. 检查 localStorage: `console.log('Token:', !!localStorage.getItem('leasToken'))`
4. 刷新页面验证登录状态保持
## 🔍 控制台日志说明
### HTTPS 环境(加密存储)
```
[Token缓存] ✅ 已保存到加密存储
[Token缓存] ✅ 从加密存储加载成功
```
### HTTP 环境(自动降级)
```
[Token缓存] ⚠️ 加密存储失败,降级为明文存储
[Token缓存] ✅ 已保存到明文存储(降级模式)
[Token缓存] ✅ 从明文存储加载成功(降级模式)
```
## 🔒 安全说明
- **HTTPS 环境**: 自动使用 AES-GCM 加密,安全性高 ✅
- **HTTP 环境**: 降级为明文存储,建议尽快升级到 HTTPS ⚠️
- **生产环境**: 强烈推荐使用 HTTPS 部署
## ✅ 向后兼容
- ✅ 完全向后兼容,无需数据迁移
- ✅ 自动识别旧的明文 token
- ✅ 支持自动升级到加密存储(如果环境支持)
---
**修复时间:** 2026-01-08
**影响范围:** 所有用户的登录和会话管理
**紧急程度:** 建议尽快部署测试