使用SAS令牌通过上传链接在Azurite上传文件时遭遇403错误
排查Azurite上传文件403错误的核心问题
1. SAS令牌绑定的Blob名称不匹配
你生成SAS时指定的blob_name="myblob",但实际要上传的目标Blob是device.log——SAS令牌是和具体Blob名称绑定的,名称不匹配会直接触发403权限拒绝。
修改generate_blob_sas中的blob_name参数,与目标Blob保持一致:
sas_token = generate_blob_sas( account_name="devstoreaccount1", account_key="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==", container_name=container_name, blob_name=blob_name, # 替换为目标Blob变量 permission=BlobSasPermissions(create=True), expiry=datetime.utcnow() + timedelta(hours=1), )
2. 连接字符串与SAS账户信息不一致
连接字符串中AccountName=myaccount,但生成SAS时用的是Azurite默认账户名devstoreaccount1,身份验证主体不匹配会导致权限校验失败。同时连接字符串中缺失AccountKey,需要补全为Azurite默认密钥:
connect_str = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;"
3. 权限范围不足
如果目标Blob已存在,仅create权限无法覆盖上传,需要补充write权限:
permission=BlobSasPermissions(create=True, write=True),
4. 请求头优化
手动设置的Content-Length可能因计算错误导致校验失败,可去掉该字段让requests自动处理:
headers = { "x-ms-blob-type": "BlockBlob", "Content-Type": "application/octet-stream", } response = requests.put(upload_url, data=file_contents, headers=headers)
额外验证步骤
- 确认Azurite服务正在运行,且
files容器已提前创建 - 打印生成的SAS令牌,检查
sr=b(Blob级SAS)、sp权限字段(如cw对应create+write)、se过期时间是否符合预期
内容的提问来源于stack exchange,提问作者Harry Wilson
相关产品推荐
相关产品推荐

