221 lines
5.4 KiB
Markdown
221 lines
5.4 KiB
Markdown
# 图片上传认证问题解决方案
|
|
|
|
## 🚨 问题描述
|
|
|
|
调用 `http://localhost/dev-api/resource/oss/upload` 接口时,返回401认证失败错误:
|
|
|
|
```json
|
|
{
|
|
"code": 401,
|
|
"msg": "认证失败,无法访问系统资源",
|
|
"data": null
|
|
}
|
|
```
|
|
|
|
## 🔍 问题分析
|
|
|
|
### 1. 认证头缺失
|
|
根据项目规范,上传接口需要以下认证头:
|
|
|
|
| 字段名 | 必填 | 说明 | 示例值 |
|
|
|--------|------|------|--------|
|
|
| Authorization | 是 | Bearer + Token | "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." |
|
|
| clientid | 是 | 客户端ID | "e5cd7e4891bf95d1d19206ce24a7b32e" |
|
|
| Content-Language | 是 | 语言设置 | "zh-CN,zh;q=0.9,en;q=0.8" |
|
|
| referer | 是 | 来源页面 | "http://localhost/login?redirect=%252Findex" |
|
|
|
|
### 2. 当前问题
|
|
- ❌ 缺少 `clientid` 字段
|
|
- ❌ 缺少 `Content-Language` 字段
|
|
- ❌ 缺少 `referer` 字段
|
|
- ❌ Token格式可能不正确
|
|
|
|
## 🔧 解决方案
|
|
|
|
### 1. 修复Headers设置
|
|
|
|
在 `ImageUpload/index.vue` 中,已修复headers设置:
|
|
|
|
```typescript
|
|
// 获取token函数
|
|
const getToken = () => {
|
|
return localStorage.getItem('token') || '';
|
|
};
|
|
|
|
// 获取语言设置
|
|
const getLanguage = () => {
|
|
return localStorage.getItem('language') || 'zh-CN';
|
|
};
|
|
|
|
// 构建完整的请求头
|
|
const requestHeaders = {
|
|
'Authorization': 'Bearer ' + getToken(),
|
|
'clientid': import.meta.env.VITE_APP_CLIENT_ID || 'e5cd7e4891bf95d1d19206ce24a7b32e',
|
|
'Content-Language': getLanguage(),
|
|
'referer': window.location.origin + '/login?redirect=' + encodeURIComponent(window.location.pathname),
|
|
'bucket-password': props.bucketPassword || passwordForm.value.bucketPassword || ''
|
|
};
|
|
```
|
|
|
|
### 2. 验证Token有效性
|
|
|
|
确保用户已登录且Token有效:
|
|
|
|
```javascript
|
|
// 检查Token是否存在
|
|
const token = localStorage.getItem('token');
|
|
if (!token) {
|
|
console.error('Token不存在,请先登录');
|
|
// 跳转到登录页面
|
|
window.location.href = '/login';
|
|
}
|
|
```
|
|
|
|
### 3. 测试认证信息
|
|
|
|
在浏览器控制台中运行以下代码测试认证信息:
|
|
|
|
```javascript
|
|
// 检查认证信息
|
|
function checkAuth() {
|
|
const token = localStorage.getItem('token');
|
|
const headers = {
|
|
'Authorization': 'Bearer ' + token,
|
|
'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
|
|
'Content-Language': 'zh-CN',
|
|
'referer': window.location.origin + '/login?redirect=' + encodeURIComponent(window.location.pathname)
|
|
};
|
|
|
|
console.log('Token:', token);
|
|
console.log('Headers:', headers);
|
|
|
|
return headers;
|
|
}
|
|
|
|
// 测试上传接口
|
|
async function testUpload() {
|
|
const headers = checkAuth();
|
|
|
|
try {
|
|
const response = await fetch('/dev-api/resource/oss/upload', {
|
|
method: 'POST',
|
|
headers: headers,
|
|
body: new FormData()
|
|
});
|
|
|
|
const result = await response.json();
|
|
console.log('测试结果:', result);
|
|
|
|
return result;
|
|
} catch (error) {
|
|
console.error('测试失败:', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// 运行测试
|
|
testUpload();
|
|
```
|
|
|
|
## 🧪 调试步骤
|
|
|
|
### 步骤1:检查Token
|
|
```javascript
|
|
// 在浏览器控制台运行
|
|
console.log('Token:', localStorage.getItem('token'));
|
|
```
|
|
|
|
### 步骤2:检查Headers
|
|
```javascript
|
|
// 在浏览器控制台运行
|
|
const headers = {
|
|
'Authorization': 'Bearer ' + localStorage.getItem('token'),
|
|
'clientid': 'e5cd7e4891bf95d1d19206ce24a7b32e',
|
|
'Content-Language': 'zh-CN',
|
|
'referer': window.location.origin + '/login?redirect=' + encodeURIComponent(window.location.pathname)
|
|
};
|
|
console.log('Headers:', headers);
|
|
```
|
|
|
|
### 步骤3:测试接口
|
|
```javascript
|
|
// 在浏览器控制台运行
|
|
fetch('/dev-api/resource/oss/upload', {
|
|
method: 'POST',
|
|
headers: headers,
|
|
body: new FormData()
|
|
}).then(response => response.json()).then(console.log);
|
|
```
|
|
|
|
## ⚠️ 常见问题
|
|
|
|
### 1. Token过期
|
|
**症状**: 401认证失败
|
|
**解决**: 重新登录获取新Token
|
|
|
|
### 2. clientid错误
|
|
**症状**: 401认证失败
|
|
**解决**: 检查环境变量 `VITE_APP_CLIENT_ID` 或使用默认值
|
|
|
|
### 3. 缺少必需字段
|
|
**症状**: 401认证失败
|
|
**解决**: 确保包含所有必需的认证头字段
|
|
|
|
### 4. 跨域问题
|
|
**症状**: CORS错误
|
|
**解决**: 检查后端CORS配置
|
|
|
|
## 🔄 验证修复
|
|
|
|
### 1. 功能测试
|
|
- [ ] 用户已登录且Token有效
|
|
- [ ] Headers包含所有必需字段
|
|
- [ ] 上传接口返回200状态码
|
|
- [ ] 文件上传成功
|
|
|
|
### 2. 安全测试
|
|
- [ ] 未登录用户无法上传
|
|
- [ ] 过期Token无法上传
|
|
- [ ] 错误clientid无法上传
|
|
|
|
## 📝 使用示例
|
|
|
|
### 正确的Headers示例
|
|
```javascript
|
|
{
|
|
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
|
|
"clientid": "e5cd7e4891bf95d1d19206ce24a7b32e",
|
|
"Content-Language": "zh-CN",
|
|
"referer": "http://localhost/login?redirect=%2Findex",
|
|
"bucket-password": "your_bucket_password"
|
|
}
|
|
```
|
|
|
|
### 错误示例
|
|
```javascript
|
|
// ❌ 缺少Bearer前缀
|
|
"Authorization": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
|
|
|
|
// ❌ 缺少clientid
|
|
{
|
|
"Authorization": "Bearer ...",
|
|
"Content-Language": "zh-CN"
|
|
}
|
|
|
|
// ❌ 缺少必需字段
|
|
{
|
|
"Authorization": "Bearer ..."
|
|
}
|
|
```
|
|
|
|
## 🔗 相关文档
|
|
|
|
- [API文档基础规范](../API/API文档基础规范.md)
|
|
- [图片上传组件安全改造说明](./图片上传组件安全改造说明.md)
|
|
- [MinIO安全改造方案](../中间件配置/minio-security-solution.md)
|
|
|
|
---
|
|
|
|
**更新时间**: 2025-01-27
|
|
**版本**: v1.0.0
|
|
**维护者**: 开发团队 |