用于blob的Azure PHP SAS
我正在尝试为我的azure blob存储创建一个用于blob的Azure PHP SAS,php,azure,azure-storage-blobs,Php,Azure,Azure Storage Blobs,我正在尝试为我的azure blob存储创建一个SAS,但我得到的消息是我的签名字段格式不正确 首先是创建签名的函数: function getSASForBlob($accountName,$container, $blob, $resourceType, $permissions, $expiry,$key){ /* Create the signature */ $_arraysign = array(); $_arraysign[] = $permissions
SAS
,但我得到的消息是我的签名字段格式不正确
首先是创建签名的函数:
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)
);
}
然后是一个为我提供URL的函数:
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;
}
然后调用函数并指定参数
$container = '87d57f73-a327-4344-91a4-27848d319a66';
$blob = '8C6CBCEB-F962-4939-AD9B-818C124AD3D9.mp4';
$endDate = date('YYYY-MM-DDThh:mmTZD', strtotime('+1 day'));
$_signature = getSASForBlob($accountName,$container,$blob,'b','r',$endDate,$accountKey);
$_blobUrl = getBlobUrl($accountName,$container,$blob,'b','r',$endDate,$_signature);
这是我得到的结果url,当我跟踪它时,我会收到下一条错误消息:
身份验证失败
服务器无法
验证请求。请确保授权标头的值
包括签名在内的格式正确。
请求ID:41f089a3-0001-0027-376f-6966d1000000
时间:2016-02-17T10:38:00.2724783Z签名字段不正确
形成
构建
规范化数据源的方式存在问题。请从此行中删除/
之前的$accountName
:
$_arraysign[] = '/' . $accountName . '/' . $container . '/' . $blob;
因此,它应该是:
$_arraysign[] = $accountName . '/' . $container . '/' . $blob;
根据文件:
因为问题是您使用了错误的日期时间格式。根据:
signedstart和signedexpiry字段必须表示为UTC时间,并且必须符合有效的ISO 8601格式。支持的ISO 8601格式包括以下内容:
- YYYY-MM-DD
- YYYY-MM-DDThh:mmTZD
- YYYY MM DDThh:MM:ssTZD
在PHP中,应按以下格式创建日期时间:
$expiry = date('Y-m-d\TH:i:s\Z', strtotime('+1 day'));
然后它将是正确的格式。此修改仍然得到相同的结果。我注意到的另一件事是URL中的se
参数(201620160160160160160febfeb-thuthuce1111%3A0202CET3600Thu
)。请检查您是否传递了SAS到期的正确值?
$expiry = date('Y-m-d\TH:i:s\Z', strtotime('+1 day'));