当前位置: 首页 > 知识库问答 >
问题:

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

严远
2023-03-14
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')

结果:失败异常:ClientAuthenticationError:服务器无法对请求进行身份验证。确保包括签名在内的授权头的值是正确形成的。requestid:cdccbb2e-e01e-0007-6cfd-40c024000000时间:2020-06-12t21:09:22.1504720z错误代码:身份验证失败错误:无身份验证错误详细信息:在HTTP请求'n+okbbfhsn12nhw3siqk4oxuglaxqrc32mh93gweism='中找到的MAC签名与任何计算的签名都不相同。服务器使用以下字符串进行签名:'PUT 302 Application/Octet-Stream*X-MS-BLOB-Type:BlockBLOB X-MS-Client-Request-ID:FCBA350C-ACF0-11EA-B094-0242AC100105-X-MS-DATE:FRI,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/future/thread.py”,第57行,在run result=self.fn(*self.args,__run_sync_func返回func(**params)文件“/home/site/wwwroot/textqueue/__init.py”,第32行,在main 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返回func(*args,**kwargs)文件.py“,第496行,在upload_blob返回upload_block_blob(**options)文件”/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_upload_helpers.py“中,line 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引发错误

使用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.5723115 Z错误代码:AuthorizationResourceTypeMission错误:None Stack:文件“/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中)文件*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')文件_use_tracer返回func(*args,**kwargs)文件“/home/site/wwwroot/.python_packages/lib/site-packages/azure/storage/blob/_blob_client.py”,第496行,在upload_blob r中eturn 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行,在

我引用了azure storage BlobClient类

这个函数是否需要put的Http操作方法?我在azure sdk for Python中没有看到它的引用。任何指导都是非常感谢的。

共有1个答案

呼延高超
2023-03-14

根据使用Azure库和Azure Storage的指南,我添加了azure-identity并按照服务原则“4A:使用blob Storage和authentication”进行身份验证

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

我的第一次尝试是使用“4B:使用带有连接字符串的blob存储”中的指导,但没有成功。使用服务原则并遵循系统分配的托管标识和授权访问blob的指示似乎已经解决了这个问题。

 类似资料:
  • 我试图通过Java Apachebeam MongoDbIO连接器连接到MongoDB,得到一个“未授权”错误。 同样的连接细节也适用于Python并能够检索数据。 “org.apache.beam.sdk.io.mongodbo.mongodbio$boundedmongodbsource.$closeresource(Mongodbio.java:407)位于org.apache.beam.s

  • 因此,我已经研究了许多关于这个问题的问题,但没有找到解决方案。 以下是我目前在尝试使用谷歌地图Android API时收到的错误。 这是我的清单文件 这是片段。地图的java 以及布局。相同的xml 下面的图片显示了启用的谷歌地图Android API 下面是显示生成的API密钥的

  • 授权失败。请参阅https://developers.google.com/maps/documentation/android/start了解如何正确设置地图。 确保以下内容与API控制台中的内容相对应:包名称:,API密钥:,证书指纹:联系Google服务器失败。建立连接后将进行另一次尝试。 加载地图失败。联系Google服务器时出错。这可能是身份验证问题(但可能是由于网络错误)。 我知道关于

  • 我创建了一个服务帐户,并为其分配了访问云功能的权限: gcloud beta函数add-iam-policy-binding MyFunction--member=serviceaccount:cf-access@my-project.iam.gserviceaccount.com--role=roles/cloudfunctions.admin 产出: 现在,我下载了服务帐户json文件。 所以

  • 我的步骤: > 从debug.keystore获取SHA1代码 在google API控制台中创建应用程序 已启用google map api v2 输入sha1;my.package.name 获取API密钥 已创建AndroidManifest文件: 已创建布局 编译后我得到了崩溃: 之后,我将布局更改为: 并将MyActivity更改为 结果,应用程序启动了,但我没有看到地图。 控制台日志:

  • 我目前正在使用SHA1证书指纹,该证书来自发布证书,用于在AppStore上发布我的应用程序。 编辑:我还在API控制台上打开了Google Map Android API v2。 我从这里的注释中读到了“签名算法必须是SHA1withRSA而不是SHA256WITHRSA”。但是,我从Eclipse创建了发布证书,它是SHA256withRSA,我没有对它做任何设置。我似乎也改变不了。