在 Azure Blob 存储中上传文件时出现 InvalidAuthenticationInfo 错误
Posted
技术标签:
【中文标题】在 Azure Blob 存储中上传文件时出现 InvalidAuthenticationInfo 错误【英文标题】:InvalidAuthenticationInfo error while uploading dcument in Azure blob storage 【发布时间】:2021-06-10 11:39:12 【问题描述】:我正在尝试通过 REST API 在 Azure Blob 存储中上传文档,但出现身份验证错误。
分享请求头和url-
message = bytes(sas_token, 'utf-8')
secret = bytes(key, 'utf-8')
signature = base64.b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())
signature = str(signature)
header =
"x-ms-version": "2020-04-08",
"x-ms-date":"Fri, 12 Mar 2021 23:39:12 GMT",
"Content-Type": "application/pdf; charset=UTF-8" ,
"Content-Length": "1048576",
"x-ms-copy-source" : ""
"x-ms-blob-type": "BlockBlob",
"Authorization": "SharedKey myaccount:" + signature,
URL - "https://"+ account_name+".blob.core.windows.net/"+container_name+"/"+name
response- requests.put(url, headers=headers)
响应 -
<?xml version="1.0" encoding="utf-8"?><Error><Code>InvalidAuthenticationInfo</Code><Message>Authentication information is not given in the correct format. Check the value of Authorization header.
如果我的文档位置是OBJECT_LOCATION = "/home/meera/Downloads/download.pdf"
,我也不确定如何传递文档我想将这个download.pdf文件上传到blob存储中。
以下文档 - https://docs.microsoft.com/en-us/rest/api/storageservices/put-blob
【问题讨论】:
【参考方案1】:您似乎正在使用 Shared Access Signature (SAS)
而不是存储帐户密钥进行授权。如果是这种情况,那么您实际上不需要计算签名,因为签名已经在 SAS 中计算。
您的代码将类似于:
header =
"Content-Type": "application/pdf; charset=UTF-8" ,
"Content-Length": "1048576",
"x-ms-blob-type": "BlockBlob"
URL - "https://"+ account_name+".blob.core.windows.net/"+container_name+"/"+name+"?"+sas_token
response- requests.put(url, headers=headers)
更新
请试试这个代码。
account_name = "account-name"
container_name = "container-name"
name = "file-name.pdf"
sas_token = "?shared-access-signature-token"
filepath = "full path of the file-name.pdf"
with open(filepath, 'r') as f:
file_content = f.read() # Read whole file in the file_content string
headers = "Content-Type": "application/pdf; charset=UTF-8", "x-ms-blob-type": "BlockBlob"
url = "https://"+ account_name+".blob.core.windows.net/"+container_name+"/"+name+sas_token
response = requests.put(url, headers=headers, data=file_content)
【讨论】:
是的,我使用的是 SAS。我尝试了您的解决方案,但该错误未修复。分享 api 响应-<Response [403]> <?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. RequestId:e1a9cee9-101e-0033-175a-178d04000000 Time:2021-03-12T16:10:43.7053108Z</Message><AuthenticationErrorDetail>sr is mandatory. Cannot be empty</AuthenticationErrorDetail></Error>
此错误表明您的共享访问签名令牌有问题。你是如何创建令牌的?
我从 sas_token 中删除了一个额外的问号,但没有收到该错误。
我添加了“?”在 URL 中认为您的 SAS 令牌没有它。现在可以下载 blob 了吗?
我从 azure 门户生成了 sas 令牌。以上是关于在 Azure Blob 存储中上传文件时出现 InvalidAuthenticationInfo 错误的主要内容,如果未能解决你的问题,请参考以下文章
Azure Databricks 在 Blob 存储上打开文件时出现问题
在从 blob 存储中获取文件并传递给模型进行预测时出现 azure aci webservice 的超时错误