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

Spring Boot中使用AWS SDK对接Cloudflare R2 Storage时401 Unauthorized错误的解决方法

Spring Boot中使用AWS SDK对接Cloudflare R2 Storage时401 Unauthorized错误的解决方法

嘿,碰到R2对接的401错误别慌,我之前帮好几个开发者排查过这类问题,咱们一步步拆解可能的原因和解决办法:

先检查你的凭证配置是否正确

很多人第一步就栽在凭证上,一定要注意这几点:

  • 别把Cloudflare的全局API密钥和R2的API Token搞混!你必须用R2存储页面里「API Tokens」生成的专属Access Key和Secret Key,全局密钥在R2这里根本不管用。
  • 生成Token的时候,必须给足对应的权限:比如上传文件需要勾选「Object > Write」权限,而且资源范围要指定你那个东欧(EEUR)区域的目标Bucket,或者选「All buckets」(生产环境建议最小权限)。要是权限没给够,哪怕凭证正确也会返回401。
  • Spring Boot里的配置要对应对,比如用AWS SDK v2的话,application.properties的配置得是这个样子:
# 替换成你的R2账户ID和区域端点
spring.cloud.aws.s3.endpoint=https://<你的账户ID>.eeur.r2.cloudflarestorage.com
spring.cloud.aws.credentials.access-key=你的R2专属Access Key
spring.cloud.aws.credentials.secret-key=你的R2专属Secret Key
# R2不需要严格的AWS区域,设为auto就行
spring.cloud.aws.region.static=auto

确认端点和区域配置没出错

你说Bucket在EEUR区域,那对应的R2区域端点格式必须是https://<你的账户ID>.eeur.r2.cloudflarestorage.com,千万别用全局端点或者填错区域ID!另外,绝对不要把Bucket名拼在端点URL里,Bucket名要通过SDK的参数单独指定,不然签名验证肯定过不了。

别漏掉路径样式访问的设置

这是很多人容易忽略的点!AWS SDK默认用虚拟主机样式访问(Bucket名在域名前),但R2要求用路径样式访问(Bucket名在URL路径里)。如果是手动构建S3Client的话,一定要加上这个配置:

S3Client s3Client = S3Client.builder()
        .endpointOverride(URI.create("https://<你的账户ID>.eeur.r2.cloudflarestorage.com"))
        .credentialsProvider(StaticCredentialsProvider.create(
                AwsBasicCredentials.create("你的Access Key", "你的Secret Key")
        ))
        .region(Region.of("auto"))
        .serviceConfiguration(S3Configuration.builder()
                // 这个配置必须开,否则签名不匹配
                .pathStyleAccessEnabled(true)
                .build())
        .build();

如果是用Spring Cloud AWS的自动配置,也要确保在配置文件里开启路径样式:

spring.cloud.aws.s3.path-style-access-enabled=true

用curl快速定位问题

要是上面的配置都检查过还是不行,建议用curl先测试,排除Spring Boot代码的问题:

curl -X PUT "https://<你的账户ID>.eeur.r2.cloudflarestorage.com/你的Bucket名/test-file.txt" \
     -H "Content-Type: text/plain" \
     -d "测试内容" \
     --user "<你的Access Key>:<你的Secret Key>"

如果curl能成功上传,说明凭证和端点是对的,问题出在Spring Boot的SDK配置里;如果curl也返回401,那大概率是凭证权限或者过期的问题,去R2的API Tokens页面看看Token是不是还在活跃状态。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:24:37