Java Spring用SAS令牌传文件到Azure Blob存储遇签名不匹配问题求助
解决Azure Blob存储SAS令牌签名不匹配问题
针对你遇到的Signature did not match错误,结合代码和SAS参数,以下是具体排查和修复步骤:
1. 修正SAS令牌的sr参数
你的SAS令牌中sr=d(代表Directory),但你是直接上传到容器下的Blob,参数不匹配。根据操作场景,应将sr改为:
sr=c:容器级别SAS,允许对容器内Blob进行操作sr=b:Blob级别SAS(针对单个Blob的场景)
修改后的SAS URI示例:https://domain.blob.core.windows.net/containerName/?sv=2022-11-02&se=2023-10-17T04%3A29%3A52z&sr=c&sp=w&sdd=1&sig=xxxxxxxxxxxx
2. 修复SAS有效期格式错误
你的SAS令牌中se参数是2023-10-17To4%3A29%3A52z,其中o是拼写错误,应改为T(ISO 8601格式的时间分隔符),修正为2023-10-17T04%3A29%3A52z,否则服务端会解析有效期失败,导致签名验证不通过。
3. 修正代码中的文件路径引号
代码里uploadFromFile(“File”)使用了中文引号,会导致编译错误或文件路径识别失败,替换为英文双引号:
blobClient.uploadFromFile("File");
同时确保"File"是正确的本地文件路径(比如"/path/to/your/local/file.txt")。
4. 验证SAS令牌权限范围
确认sp=w权限足够:w权限允许创建、写入、覆盖Blob,满足上传需求。如果后续需要读取等操作,可扩展为sp=wr,当前场景w已足够。
5. 优化BlobClient构造方式
如果使用容器级SAS URI,推荐通过BlobContainerClient获取BlobClient,逻辑更清晰:
BlobContainerClient containerClient = new BlobContainerClientBuilder() .endpoint(sasTokenUri) .buildClient(); BlobClient blobClient = containerClient.getBlobClient(blobName); blobClient.uploadFromFile("/path/to/local/file");
完成以上修正后重新测试,即可解决签名不匹配问题。
内容的提问来源于stack exchange,提问作者Dev-eloper
相关产品推荐
相关产品推荐

