图片上传认证问题解决方案.md 5.4 KB

图片上传认证问题解决方案

🚨 问题描述

调用 http://localhost/dev-api/resource/oss/upload 接口时,返回401认证失败错误:

{
  "code": 401,
  "msg": "认证失败,无法访问系统资源",
  "data": null
}

🔍 问题分析

1. 认证头缺失

根据项目规范,上传接口需要以下认证头:

字段名 必填 说明 示例值
Authorization 是 Bearer + Token "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
clientid 是 客户端ID "e5cd7e4891"
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
维护者: 开发团队