【问题标题】:Azure - Generate SAS Token for Blob from PHPAzure - 从 PHP 生成 Blob 的 SAS 令牌
【发布时间】:2018-08-14 06:31:35
【问题描述】:

我在门户中创建了一个 SAS 令牌,一切正常,我可以访问私有 blob。

我正在尝试使用此功能动态创建新的 SAS 令牌:

function generateSasToken($uri, $sasKeyName, $sasKeyValue) 
{ 
    $targetUri = strtolower(rawurlencode(strtolower($uri))); 
    $expires = time();     
    $expiresInMins = 60; 
    $week = 60*60*24*7;
    $expires = $expires + $week; 
    $toSign = $targetUri . "\n" . $expires; 
    $signature = rawurlencode(base64_encode(hash_hmac('sha256',             
    $toSign, $sasKeyValue, TRUE))); 

    $token = "SharedAccessSignature sr=" . $targetUri . "&sig=" . $signature . "&se=" . $expires .         "&skn=" . $sasKeyName; 
    return $token; 
}

这确实会生成一个 SAS 令牌,但格式与从门户生成的帐户范围内的格式略有不同。

当我尝试使用令牌时收到错误:

<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:1d65690e-e01e-00a6-3d3f-b505c1000000 Time:2018-03-06T11:40:20.5662128Z
</Message>
<AuthenticationErrorDetail>Signature fields not well formed.</AuthenticationErrorDetail>
</Error>

正常工作的帐户范围的 SAS 具有以下格式:

?sv=2017-07-29&ss=b&srt=sco&sp=rwdlac&se=2019-03-03T04:26:37Z&st=2018-03-02T20:26:37Z&spr=https&sig=LjxZDst%2F1Ec745%2BMpZ8PueQErDCySr%2BQLRV1UKBtEGE%3D

函数生成的 SAS Token 失败,格式如下:

SharedAccessSignature
sr=<URL>%2fnewteamofficialfc%2fsummarydata.csv&sig=8cURAqmkXFVbq7CYyfk3BsXZJ0dJbHwNhiwJ1jL8jMA%3D&se=1520941694&skn=key2

【问题讨论】:

标签: php azure


【解决方案1】:

使用最新版本的 PHP API(2020 年 8 月),您可以使用以下类生成 SAS。您只需要:

  • 帐户名称
  • 帐户密钥
  • 容器名称
  • blob 名称
use MicrosoftAzure\Storage\Common\Internal\Resources;

$sas_helper = new MicrosoftAzure\Storage\Blob\BlobSharedAccessSignatureHelper($_ENV['azure_account_name'], $_ENV['azure_account_key']);
$sas = $sas_helper->generateBlobServiceSharedAccessSignatureToken(
    Resources::RESOURCE_TYPE_BLOB,              # Resource name to generate the canonicalized resource. It can be Resources::RESOURCE_TYPE_BLOB or Resources::RESOURCE_TYPE_CONTAINER
    "{$container}/{$blob}",                     # The name of the resource, including the path of the resource. It should be {container}/{blob}: for blobs.
    "r",                                        # Signed permissions.
    (new \DateTime())->modify('+10 minute'),    # Signed expiry
    (new \DateTime())->modify('-5 minute'),     # Signed start
    '',                                         # Signed IP, the range of IP addresses from which a request will be accepted, eg. "168.1.5.60-168.1.5.70"
    'https',                                    # Signed protocol, should always be https
);
echo "https://{$_ENV['azure_account_name']}.blob.core.windows.net/{$container}/{$blob}?{$sas}";

用您访问 API 密钥的首选方法替换 $_ENV 变量。

要了解更多关于上面到底发生了什么,请看这里: https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#service-sas-example

【讨论】:

  • 谢谢。如果您使用此代码 sn-p,您需要在顶部添加资源的命名空间:use MicrosoftAzure\Storage\Common\Internal\Resources;
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 2021-11-08
  • 2020-05-30
相关资源
最近更新 更多