【问题标题】:PHP Create Working Azure Signature For Blob StoragePHP 为 Blob 存储创建有效的 Azure 签名
【发布时间】:2015-10-25 01:01:32
【问题描述】:

有人可以为我提供一个工作示例 (php) 来创建在为 2015 年仍在工作的 microsoft azure blob 服务构建“Shared Access Signatures URL”时所需的签名吗? 我在互联网上找到的所有示例和教程都使用旧的非官方 azure sdk 或从提供的代码创建的签名不起作用,因为我总是收到以下错误:

<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:2c406e11-0001-00b1-3a5a-0eb263000000 Time:2015-10-24T12:46:34.5256055Z</Message>
    <AuthenticationErrorDetail>Signature fields not well formed.</AuthenticationErrorDetail>
</Error>

这是我尝试过的代码:thisthis

这就是我现在的代码:

$key = "myKeyBase64==";
$sig = getSASForBlob("accName","containerName", "abc.mp3", "b", "r", date("c", time() + 30000), $key);
$url = getBlobUrl("accName","containerName","abc.mp3","b","r",date("c", time() + 30000),$sig);

echo($url);

function getSASForBlob($accountName,$container, $blob, $resourceType, $permissions, $expiry,$key){
     /* Create the signature */
     $_arraysign = array();
     $_arraysign[] = $permissions;
     $_arraysign[] = '';
     $_arraysign[] = $expiry;
     $_arraysign[] = '/' . $accountName . '/' . $container . '/' . $blob;
     $_arraysign[] = '';
     $_arraysign[] = "2014-02-14"; //the API version is now required
     $_arraysign[] = '';
     $_arraysign[] = '';
     $_arraysign[] = '';
     $_arraysign[] = '';
     $_arraysign[] = '';

     $_str2sign = implode("\n", $_arraysign);

     return base64_encode(
     hash_hmac('sha256', urldecode(utf8_encode($_str2sign)), base64_decode($key), true)
     );
}

 function getBlobUrl($accountName,$container,$blob,$resourceType,$permissions,$expiry,$_signature){
     /* Create the signed query part */
     $_parts = array();
     $_parts[] = (!empty($expiry))?'se=' . urlencode($expiry):'';
     $_parts[] = 'sr=' . $resourceType;
     $_parts[] = (!empty($permissions))?'sp=' . $permissions:'';
     $_parts[] = 'sig=' . urlencode($_signature);
     $_parts[] = 'sv=2014-02-14';

     /* Create the signed blob URL */
     $_url = 'https://'
     .$accountName.'.blob.core.windows.net/'
     . $container . '/'
     . $blob . '?'
     . implode('&', $_parts);

     return $_url;
 }

【问题讨论】:

  • 你能分享你创建共享访问签名的代码吗?
  • 我试过这个(最后一个帖子)link 和这个link
  • 感谢分享链接。还有一个问题:您是否更改了您正在使用的代码示例中提到的服务版本,或者您使用了相同的服务版本?
  • 我改了api版本,我也试过最新的。
  • 如果您使用的是“2015-02-21”或更高版本,则创建规范化资源字符串的方式会发生重大变化。您需要在规范化资源中添加“blob”。因此,如果您在代码中使用“account-name/container-name”,则必须使用“blob/account-name/container-name”。但是,如果您使用的是之前的版本,那么“帐户名称/容器名称”应该可以工作。让我也尝试一下,并在我有一些工作代码后发布答案。

标签: php azure azure-blob-storage signature


【解决方案1】:

我发现您的代码有一个问题:

本质上,您正在以不正确的格式格式化到期时间。您的到期时间应采用YYYY-MM-DDTHH:mm:ssZ 格式。

请尝试以下代码:

$expiry = gmdate("Y-m-d\TH:i:s\Z", time() + 30000);
$sig = getSASForBlob("accName","containerName", "abc.mp3", "b", "r", $expiry, $key);
$url = getBlobUrl("accName","containerName","abc.mp3","b","r",$expiry,$sig);

您无需更改getSASForBlobgetBlobUrl 函数。

我尝试使用上面的代码并能够使用 SAS URL 下载 blob。

【讨论】:

  • 对我来说是这样说的。 &lt;AuthenticationErrorDetail&gt;Signature did not match. String to sign used was r 2021-07-16T19:26:15Z /actblobcontainers/actcontainer 2014-02-14 &lt;/AuthenticationErrorDetail&gt;
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2015-02-14
  • 2017-08-24
  • 2021-10-13
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多