当我输入这个问题时,我偶然发现了答案,希望它可以帮助其他人,所以我不会删除它。
失败的原因是我使用我的媒体服务帐户名称/密钥来访问 AMS API 和生成 SAS。这是错误的。我需要:
- 使用 AMS 帐户/密钥创建资产
- 使用链接的存储帐户/密钥创建 SAS URL
我在这里遇到了一个与 CORS 相关的错误,这似乎是朝着正确方向迈出的一步,如果失败将更新。
编辑 1:它确实失败了。我需要将我的 API 调用版本更新为 2013-08-13 及更高版本,这改变了正确的 SAS 校验和生成。请注意the current official PHP SDK will only use storage version 2012-02-12,因此您将无法使用它启用 CORS。
我的代码如下(它是超级混乱,因为我正在这样做作为原型):
<?php
use Beberlei\AzureBlobStorage\SharedAccessSignature;
use WindowsAzure\Common\Internal\MediaServicesSettings;
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\MediaServices\MediaServicesRestProxy;
use WindowsAzure\MediaServices\Models\Asset;
require 'vendor/autoload.php';
$fileName = $_GET['blobName'];
$accountName = '<AMS account>';
$accessKey = '<AMS key>';
$settings = new MediaServicesSettings($accountName, $accessKey);
/** @var MediaServicesRestProxy $proxy */
$proxy = ServicesBuilder::getInstance()->createMediaServicesService($settings);
$asset = new Asset(Asset::OPTIONS_NONE);
$asset->setName($fileName);
/** @var Asset $asset */
$asset = $proxy->createAsset($asset);
$assetId = $asset->getId();
$path = parse_url($asset->getUri(), PHP_URL_PATH);
$startTime = new \DateTime('now -5 minutes');
$expiryTime = new \DateTime('now +30 minutes');
$signatureGenerator = new SharedAccessSignature('<storage account>', '<storage key>');
$signature = $signatureGenerator->createSignedQueryString(
$path,
'',
'c',
'w',
isoDate($startTime),
isoDate($expiryTime)
);
die($asset->getUri().'?'.$signature);
function isoDate(\DateTime $dateTime)
{
$tz = date_default_timezone_get();
date_default_timezone_set('UTC');
$returnValue = str_replace('+00:00', '.0000000Z', date('c', $dateTime->getTimestamp()));
date_default_timezone_set($tz);
return $returnValue;
}