使用SAS Token通过Java连接Azure容器时出现403认证失败问题
问题解决:Azure Blob SAS Token 签名不匹配(403 AuthenticationFailed)
错误根源
你的代码中Endpoint设置错误:将虚拟目录subcontainer直接追加到容器Endpoint中,导致SDK生成签名时使用的资源路径与SAS Token对应的资源不匹配。
Azure Blob存储中没有真正的"子容器"概念,subcontainer本质是虚拟目录,SAS Token是针对顶级容器mycontainername生成的,但你的代码把Endpoint设为https://mycontainername.blob.core.windows.net/subcontainer,SDK会认为目标资源是名为subcontainer的容器,而非顶级容器下的虚拟目录,最终导致签名校验失败。
修正方案
1. 修正Endpoint配置
将Endpoint改为顶级容器的地址,SAS Token保持不变:
BlobContainerClient container = new BlobContainerClientBuilder() .endpoint("https://mycontainername.blob.core.windows.net") .sasToken("sv=2020-10-02&st=2024-03-11T13:58:42Z&se=2024-03-12T14:03:42Z&sr=c&sp=racwl&sig=HVoBAVRrDWaEY1KDr0oxUCFXS8R63L%2B7S5X8n457LTA%3D") .buildClient();
2. 访问虚拟目录下的Blob
如果需要操作subcontainer下的Blob,通过前缀过滤实现:
// 列出subcontainer目录下的所有Blob(包括子目录内容) ListBlobsOptions options = new ListBlobsOptions() .setPrefix("subcontainer/") .setIncludeDetails(true); long count = container.listBlobs(options, Duration.ofSeconds(30)).stream().count();
为什么浏览器访问正常?
浏览器拼接的URL中指定了restype=container,实际是向顶级容器mycontainername发起请求,subcontainer被服务器解析为虚拟目录路径而非容器名称,因此签名校验可以通过。
内容的提问来源于stack exchange,提问作者ch1ll
相关产品推荐
相关产品推荐

