Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于blob的Azure PHP SAS_Php_Azure_Azure Storage Blobs - Fatal编程技术网

用于blob的Azure PHP SAS

用于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

我正在尝试为我的azure blob存储创建一个
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'));