You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用AWS临时密钥上传S3存储桶报错:Access Key不存在

问题描述

通过API获取临时accessKey、SecretAccessKey、SessionToken,用于在Flutter中将图片和视频上传至AWS S3存储桶。已尝试pub.dev上多数相关包,但大多已废弃。

当前代码如下:

Future<void> uploadToS3({
required String accessKeyId,
required String secretAccessKey,
required String sessionToken,
required String filePath,
required String bucketName,
required String region,
required String objectKey,
 }) async {
   final s3_storage = S3Storage(
    endPoint: 's3.$region.amazonaws.com',
    accessKey: accessKeyId,
    secretKey: secretAccessKey,
    sessionToken: sessionToken,
    region: 'my region',
    signingType: SigningType.V4);

try {
    await s3_storage.fPutObject(bucketName, objectKey,filePath);

    print('Upload successful!');
   } catch (e) {
   print('Upload failed: $e');
  }
  }

收到AWS返回的错误:

StorageError: The AWS Access Key Id you provided does not exist in our records.

使用原始密钥时代码可正常运行,用脚本使用临时密钥也能成功上传文件,但在Flutter中使用临时密钥就会出现上述错误。

解决方案
  • 修正Region参数硬编码问题
    代码中S3Storage的region字段被写死为'my region',但参数里已经传入了正确的region变量。临时密钥与区域绑定,区域不匹配会导致签名验证失败,直接触发密钥不存在的错误。将region: 'my region'替换为region: region。

  • 验证临时密钥的有效性
    确认获取的临时密钥包含S3的PutObject权限,且未过期。可以通过AWS CLI执行aws sts get-caller-identity命令,传入临时密钥信息,验证密钥是否能正常调用AWS服务。

  • 检查包的临时密钥处理逻辑
    当前使用的S3Storage包可能存在临时密钥签名缺陷,比如未将SessionToken正确携带到请求头中。建议更换维护活跃的包,比如amplify_flutter的存储模块,或aws_client包,这类包对临时密钥的支持更完善。

  • 对比请求签名细节
    开启AWS S3的请求日志,对比Flutter代码生成的请求和脚本生成的请求,重点检查Authorization头和x-amz-security-token头是否一致。如果Flutter请求中缺少x-amz-security-token,说明包未正确处理临时令牌。

内容的提问来源于stack exchange,提问作者Irfan Karim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:41:01