Java生成Azure Storage SAS Token及上传认证失败问题求助
问题:Azure Storage SAS Token生成失败导致上传AuthenticationFailed错误
业务需求
- 客户端通过gRPC发送
GetMediaUploadCredRequest请求,携带媒体类型、扩展名等信息 - 服务端返回
GetMediaUploadCredResponse,包含上传URL、HTTP头和媒体ID - 客户端通过PUT请求完成文件上传
遇到的问题
先后尝试4种Java实现方式,均触发AuthenticationFailed错误,各版本情况如下:
- 版本1:SDK生成的SAS Token仅为参数串,非完整URL,导致认证失败
- 版本2:手动构造签名,错误提示:
Signature did not match - 版本3:按文档构造签名,错误提示:
Signature fields not well formed - 版本4:用SDK生成完整URL,仍提示认证失败
排查关键点建议
权限与资源范围检查
- 确认SAS Token的权限是否包含
Write或Create(PUT上传必须) - 验证SAS的资源类型是否正确:针对单个Blob需指定
b(Blob),而非容器级别的c - 检查Token有效期,避免生成时已过期或有效期过短
- 确认SAS Token的权限是否包含
签名构造细节核对
- 手动构造签名时,严格遵循Azure的签名字符串格式:
StringToSign = account-name + "\n" + signedpermissions + "\n" + signedresource + "\n" + signedstart + "\n" + signedexpiry + "\n" + signedip + "\n" + signedprotocol + "\n" + signedversion + "\n" + rscc + "\n" + rscd + "\n" + rsce + "\n" + rscl + "\n" + rsct - 注意参数大小写敏感:比如权限用小写
w表示写,协议需和客户端请求一致(http/https)
- 手动构造签名时,严格遵循Azure的签名字符串格式:
SDK使用正确性验证
- 确认使用的Azure Storage SDK为最新稳定版,规避旧版本bug
- 生成完整URL时,检查容器名、Blob名是否正确,SAS Token拼接格式应为
https://<account>.blob.core.windows.net/<container>/<blob>?<sas-token> - 验证存储账户密钥的正确性,避免主副密钥混淆
客户端请求匹配检查
- 客户端PUT请求的URL需与服务端生成的完全一致,包括Blob名称、参数顺序
- 检查客户端请求头是否与SAS配置兼容:若生成SAS时指定了响应头规则,避免请求头冲突
- 确认客户端IP在SAS的允许IP范围内(若设置了
signedip)
内容的提问来源于stack exchange,提问作者Arnob
相关产品推荐
相关产品推荐

