5.4 KiB
5.4 KiB
图片上传认证问题解决方案
🚨 问题描述
调用 http://localhost/dev-api/resource/oss/upload 接口时,返回401认证失败错误:
{
"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设置:
// 获取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有效:
// 检查Token是否存在
const token = localStorage.getItem('token');
if (!token) {
console.error('Token不存在,请先登录');
// 跳转到登录页面
window.location.href = '/login';
}
3. 测试认证信息
在浏览器控制台中运行以下代码测试认证信息:
// 检查认证信息
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
// 在浏览器控制台运行
console.log('Token:', localStorage.getItem('token'));
步骤2:检查Headers
// 在浏览器控制台运行
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:测试接口
// 在浏览器控制台运行
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示例
{
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
"clientid": "e5cd7e4891bf95d1d19206ce24a7b32e",
"Content-Language": "zh-CN",
"referer": "http://localhost/login?redirect=%2Findex",
"bucket-password": "your_bucket_password"
}
错误示例
// ❌ 缺少Bearer前缀
"Authorization": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
// ❌ 缺少clientid
{
"Authorization": "Bearer ...",
"Content-Language": "zh-CN"
}
// ❌ 缺少必需字段
{
"Authorization": "Bearer ..."
}
🔗 相关文档
更新时间: 2025-01-27
版本: v1.0.0
维护者: 开发团队