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

