Python Azure 函数:blobclient.upload_blob 授权失败

Posted

技术标签:

【中文标题】Python Azure 函数:blobclient.upload_blob 授权失败【英文标题】:Python Azure Function: blobclient.upload_blob authorization failure 【发布时间】:2020-10-02 18:57:04 【问题描述】:

我有一个 python azure 函数,它触发队列消息并将 json 上传到 blob 存储。我在使用存储帐户 SAS URL 和 SAS 令牌以及存储帐户连接字符串的 blob.client 上遇到身份验证错误

功能代码:# 符号在我在 blobclients 实例之间交换时使用

import json
import requests
import azure.functions as func
from azure.storage.blob import BlobClient

def main(msg: func.QueueMessage) -> None:
             queuedata =  msg.get_body().decode('utf-8')
             data = json.loads(queuedata)
             url = data['data']['url']

             r = requests.get(url)
             data = r.text


             s1, s2 = (data.split(sep=';', maxsplit=1))
             s1 = ''.join(s1.split())

             dict1 = json.loads(s1)
             dict1 = json.loads(s2)
             mergedJson = **dict1, **dict1


             #connectionstring = "DefaultEndpointsProtocol=https;AccountName=XXXXXX;AccountKey=XXXXXXXX/Jm4OPgSzWOju5hD/+XA4QXXXXXXfNEbUxuO9WoUQ7xn91cE3qlQeqRoHJx3SrJ+bdln9Q==;EndpointSuffix=core.windows.net"

             sas_url = 'https://XXXXX.blob.core.windows.net/?sv=2019-10-10&ss=bq&srt=c&sp=rwdlacupx&se=2020-06-13T04:48:27Z&st=2020-06-12T20:48:27Z&spr=https&sig=1j2a6pQUFLI1B71D8oRoALHYgpF82pMiXbvrdZCY7gk%3D'
             sas_token = '?sv=XXXXXXXXXX-10-10&ss=XXXXX&XXX=c&sp=rwdlacupx&se=2020-06-13T04:48:27Z&st=2020-06-12T20:48:27Z&spr=https&sig=1j2a6pQUFLI1B71D8oRoALHYgpF82pMiXbvrdZCY7gk%3D'


             filename = dictA['FormId'] + '.json'
             #blob_client = BlobClient.from_connection_string(conn_str= connectionstring,  container_name='json', content_type='application/json', blob_name= filename)
             #blob_client.upload_blob(mergedJson, blob_type='BlockBlob')

             blob_client2 = BlobClient(account_url= sas_url, credential= sas_token, container_name='json', blob_name= filename, content_type='application/json')
             blob_client2.upload_blob(mergedJson, blob_type='BlockBlob')

关于使用 BlobClient.from_connection_string(conn_str, container_name, blob_name, snapshot=None, credential=None, **kwargs) 的连接字符串错误:

结果:失败异常:ClientAuthenticationError:服务器未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。 RequestId:cdccbb2e-e01e-0007-6cfd-40c024000000 Time:2020-06-12T21:09:22.1504720Z ErrorCode:AuthenticationFailed Error:None AuthenticationErrorDetail:MAC signature found in the HTTP request 'n+oKBbFHSn12Nhw3SIQk4OxUGLaxQRc32mh93GWEisM='任何计算的签名。服务器使用以下字符串进行签名:'PUT 302 application/octet-stream * x-ms-blob-type:BlockBlob x-ms-client-request-id:fcba350c-acf0-11ea-b094-0242ac100105 x-ms-date: 2020 年 6 月 12 日星期五 21:09:22 GMT x-ms-version:2019-07-07 /dmgenhwr/json/C1234567.json'。堆栈:文件“/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py”,第 315 行,在 _handle__invocation_request self.run_sync_func、invocation_id、fi.func、args)文件“ /usr/local/lib/python3.7/concurrent/futures/thread.py”,第 57 行,运行结果 = self.fn(*self.args, **self.kwargs) 文件“/azure-functions-host /workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py”,第 434 行,在 __run_sync_func 返回 func(**params) 文件“/home/site/wwwroot/TextQueue/__init.py”,第 32 行,在主 blob_client.upload_blob(mergedJson, blob_type='BlockBlob') 文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/core/tracing/decorator.py”,第 83 行,在wrapper_use_tracer return func(*args, **kwargs) 文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_blob_client.py”,第 496 行,在upload_blob 返回upload_block_blob(**选项)文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_uploa d_helpers.py”,第 153 行,upload_block_blob process_storage_error(error) 文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_shared/response_handlers.py”,第 147 行,process_storage_error引发错误

关于使用 BlobClient 的 SAS URL 和 SAS 令牌错误(account_url, container_name, blob_name, snapshot=None, credential=None, **kwargs):

结果:失败异常:HttpResponseError:此请求无权使用此资源类型执行此操作。 RequestId:62bb329f-b01e-0036-19fb-409bf3000000 时间:2020-06-12T20:56:14.5723115Z 错误代码:授权资源类型不匹配错误:无堆栈:文件“/azure-functions-host/workers/python/3.7/LINUX/X64/ azure_functions_worker/dispatcher.py",第 315 行,在 _handle__invocation_request self.run_sync_func、invocation_id、fi.func、args) 文件“/usr/local/lib/python3.7/concurrent/futures/thread.py”中,行57、在运行结果 = self.fn(*self.args, **self.kwargs) 文件“/azure-functions-host/workers/python/3.7/LINUX/X64/azure_functions_worker/dispatcher.py”,第 434 行,在 __run_sync_func 返回 func(**params) 文件“/home/site/wwwroot/TextQueue/__init.py”,第 35 行,在 main blob_client2.upload_blob(mergedJson, blob_type='BlockBlob') 文件“/home /site/wwwroot/.python_packages/lib/site-packages/azure/core/tracing/decorator.py”,第 83 行,在 wrapper_use_tracer 返回 func(*args, **kwargs) 文件“/home/site/wwwroot/. python_packages/lib/site-packages/azure/storage/blob/_blob_client.py”,第 496 行,在upload_blob 返回upload_block_blob(**options)文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_upload_helpers.py”,第153行,在upload_block_blob process_storage_error(错误)文件“/ home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_shared/response_handlers.py”,第 147 行,在 process_storage_error 中引发错误

我已经引用了azure storage BlobClient class

此函数是否需要 PUT 的 Http 操作方法?我没有看到 azure sdk for python 中引用的内容。非常感谢任何指导。

【问题讨论】:

【参考方案1】:

按照Use the Azure libraries with Azure Storage 的指南,我添加了 azure-identity 并按照服务原则“4a:使用带有身份验证的 blob 存储”进行身份验证设置

关键是为服务原则授予 blob 容器权限。

我的第一次尝试是使用“4b:使用带有连接字符串的 blob 存储”中的指导,但没有成功。使用服务原则并遵循以下指示 system assigned managed identity 和 authorize access to blob 似乎已经解决了这个问题。

现在遇到“缺少 PyGObject 的运行时依赖项”- 跳起来设置 python azure 函数很有趣。

【讨论】:

以上是关于Python Azure 函数:blobclient.upload_blob 授权失败的主要内容,如果未能解决你的问题,请参考以下文章

无法在 azure 函数应用程序中创建 python 函数

Azure 函数 - 触发包含 Azure CLI 命令的 Python 脚本

如何在 Python 中从 Azure 函数调用 Cosmos DB 存储过程?

Azure(函数)参数在 Python 中声明,但不在 function.json 中

高级计划中的 Python Azure 函数:函数的发布/部署失败……

在 Python 上使用 Azure 函数的雪花外部函数不起作用