在 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 Blob 存储中的文件时出现错误 500

尝试上传文件时出现异常

Azure Databricks 在 Blob 存储上打开文件时出现问题

在从 blob 存储中获取文件并传递给模型进行预测时出现 azure aci webservice 的超时错误

从 Azure Blob 存储文件名下载文件时出现的问题包含哈希 (#)

从 Azure Blob 存储批量插入时出现 ERRORFILE 问题