2016-02-17 3 views
2

Я пытаюсь создать SAS для моего хранилища azure blob, но я получаю сообщение о том, что мои поля подписи не очень хорошо сформированы.Azure PHP SAS для blob

Первая функция, которая создает подпись:

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); 

https://ttresources.blob.core.windows.net/87d57f73-a327-4344-91a4-27848d319a66/8C6CBCEB-F962-4939-AD9B-818C124AD3D9.mp4?se=2016201620162016-FebFeb-ThuThuCET1111%3A0202CET3600Thu&sr=b&sp=r&sig=1VdOjLX179wLQv5o265JBR%2B6CaLTr1nwCs6GHSVqfbA%3D&sv=2014-02-14

Это URL я получаю, как мой результат, когда я следую за это я получаю следующее сообщение об ошибке:

AuthenticationFailed Сервер не удалось аутентификации запроса. Убедитесь, что значение заголовка авторизации сформировано правильно, включая подпись. RequestId: 41f089a3-0001-0027-376f-6966d1000000 Время: 2016-02-17T10: 38: 00.2724783Z Поля подписи не хорошо .

ответ

0

Существует проблема с тем, как вы строите canonicalizedresource. Пожалуйста, удалите / перед тем $accountName от этой линии:

$_arraysign[] = '/' . $accountName . '/' . $container . '/' . $blob; 

Так оно и должно быть:

$_arraysign[] = $accountName . '/' . $container . '/' . $blob; 

На основе документации here:

URL = https://myaccount.blob.core.windows.net/music/intro.mp3 
canonicalizedresource = "myaccount/music/intro.mp3" 
+0

Все еще получаю тот же результат с этой модификацией – Jeroen

+0

Еще одна вещь, которую я заметил, - это параметр 'se' в вашем URL-адресе (' 2016201620162016-FebFeb-ThuThuCET1111% 3A0202CET3600Thu'). Можете ли вы проверить, соответствует ли вам значение SAS Expiry? –

1

Поскольку вопрос о том, что вы сделали неправильный формат даты и времени. По guide:

signedstart и signedexpiry поля должны быть выражены как раз UTC и должны соответствовать формату валидного ISO 8601. Поддерживаемые ISO 8601 форматы включают в себя следующее:

  • YYYY-MM-DD
  • YYYY-MM-ДДТчч: mmTZD
  • YYYY-MM-ДДTчч: мм: ssTZD

И в PHP вы должны создать дату-время в следующем формате:

$expiry = date('Y-m-d\TH:i:s\Z', strtotime('+1 day')); 

Тогда это будет corr ect.

Смежные вопросы