如何解决无法设置 Blob 服务属性
我有一个问题,Azure 存储 blob 没有为视频文件返回 206 部分内容。
问题:视频已完全下载(300mb 视频需要 20-40 秒)并且搜索栏不起作用。我正在使用 Laravel,只有当我尝试从 Azure Blob 存储检索 .mp4 文件时才会出现此问题。当我将媒体文件存储在公共磁盘上时,它工作正常。
一位 microsoft 员工表示将 x-ms-version 更改为 2011-01-18 或更高版本将解决我的问题。 LINK 讨论:
Microsoft 有一篇与设置 blob 服务属性相关的帖子:HERE
我正在尝试通过 Postman 发送请求,如下所示:
PUT https://{account-name}.blob.core.windows.net/?restype=service&comp=properties
我搜索了错误并在SO上找到了这个问题: The MAC signature found in the HTTP request '...' is not the same as any computed signature
它有一个公认的答案,但我似乎不明白。我的请求/授权标头有问题吗?或者我需要采取不同的方法?
提前致谢!
我在 LARAVEL 中的代码:
$date = gmdate('D,d M Y H:i:s \G\M\T');
$account_name = "xyz";
$containername = "media";
$account_key = "access_key";
$canonicalizedHeaders = "x-ms-date:$date\nx-ms-version:2017-11-09";
$canonicalizedResource = "/$account_name/$containername\ncomp:list\nrestype:container";
$arraysign = array();
$arraysign[] = 'GET'; /*HTTP Verb*/
$arraysign[] = ''; /*Content-Encoding*/
$arraysign[] = ''; /*Content-Language*/
$arraysign[] = ''; /*Content-Length (include value when zero)*/
$arraysign[] = ''; /*Content-MD5*/
$arraysign[] = ''; /*Content-Type*/
$arraysign[] = ''; /*Date*/
$arraysign[] = ''; /*If-Modified-Since */
$arraysign[] = ''; /*If-Match*/
$arraysign[] = ''; /*If-None-Match*/
$arraysign[] = ''; /*If-Unmodified-Since*/
$arraysign[] = ''; /*Range*/
$arraysign[] = $canonicalizedHeaders; /*CanonicalizedHeaders*/
$arraysign[] = $canonicalizedResource; /*CanonicalizedResource*/
$stringtosign = implode("\n",$arraysign);
$signature = 'SharedKey' . ' ' . $account_name . ':' . base64_encode(hash_hmac('sha256',$stringtosign,base64_decode($account_key),true));
$endpoint = 'https://' . $account_name . '.blob.core.windows.net';
$url = $endpoint . '/' . $containername . '?restype=container';
$headers = [
"x-ms-date:{$date}",'x-ms-version:2017-11-09','Accept:application/json;odata=nometadata',"Authorization:{$signature}"
];
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,'GET');
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$response = curl_exec($ch);
echo curl_error($ch);
curl_close($ch);
echo '<pre>';
print_r($response);
解决方法
我可以在使用共享密钥时重现您的错误(此问题来自您在 HMAC 签名后提供存储帐户密钥而不是密钥。):
但是如果我使用AD不记名令牌,那就没问题了:
获取不记名令牌的 Python 代码:
import requests
from azure.identity import ClientSecretCredential
client_id = 'xxx'
tenant_id = 'xxx'
client_secret = 'xxx'
credential = ClientSecretCredential(tenant_id=tenant_id,client_id=client_id,client_secret=client_secret)
accesstoken = str(credential.get_token('https://yourstoragename.blob.core.windows.net/.default'))[19:1282]
print(str(credential.get_token('https://yourstoragename.blob.core.windows.net/.default')))
,
我建议您应该使用 SAS token 而不是 shared key
进行身份验证。 SAS 令牌易于生成和管理。
以下是使用 SAS 令牌设置 blob 服务属性的步骤:
1.导航到azure门户->您的存储帐户->设置->共享访问签名:根据您的需要选择适当的选项->然后单击“生成SAS和连接字符串”按钮->最后,在SAS token
生成,复制并保存在一些编辑器中,如 .txt 文件。截图如下:
2. 使用 SAS 令牌构建 url。例如请求url为https://xx.blob.core.windows.net/?restype=service&comp=properties
,那么在请求url的末尾放置SAS令牌。 注意:您应该删除第一个“?”从 SAS 令牌开始,并在 SAS 令牌的开头放一个“&”。
如果 SAS 令牌是 ?sv=2020-02-10&ss=b&srt=sco&sp=rwdlacx&se=2021-02-25T10:44:44Z&st=2021-02-25T02:44:44Z&spr=https&sig=xx
那么 request url with SAS
令牌应如下所示:
https://xx.blob.core.windows.net/?restype=service&comp=properties&sv=2020-02-10&ss=b&srt=sco&sp=rwdlacx&se=2021-02-25T10:44:44Z&st=2021-02-25T02:44:44Z&spr=https&sig=xxx
3.在 postman 中,使用 request url with SAS token
作为请求 url,在 Headers 选项卡中,只需填写 2 个 headers x-ms-date
和 x-ms-version
。由于我们使用 SAS 令牌,因此无需使用 Authorization
标头。截图如下:
4.在“正文”选项卡中,按照 Request Body doc 编写正确的请求正文。由于我使用的是 x-ms-version == 2020-04-08
,因此我遵循 the doc 中的“对于版本 2019-12-12 或更高版本,请求正文的格式如下:”部分。截图如下(我只是修改了软删除属性和保留期限):
5.运行测试后,在postman中,可以看到响应码是202,在azure portal中,软删除属性开启,保留期也设置正确:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。