Files
webs/power_leasing/✅ Token存储降级方案修复说明.md
2026-01-09 17:13:29 +08:00

105 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ✅ 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
**影响范围:** 所有用户的登录和会话管理
**紧急程度:** 建议尽快部署测试