2016-05-31 7 views
0

私は、SASを使用して、プライベートAzureストレージコンテナからblobをダウンロードしようとしています。しかし、いつも私は同じミスを私に投げます。Azure Shared Access phpを使用したシグネチャエラー

<Error> 
<Code>AuthenticationFailed</Code> 
<Message> 
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. ... 
</Message> 
<AuthenticationErrorDetail> 
Signature did not match. String to sign used ... /blob/name/container/archive.jpg 
</AuthenticationErrorDetail> 
</Error> 

これは私のコードです:

static private function getSASForBlob($accountName,$containerName, $fileName, $resourceType, $permissions, $expiry) { 
    /* Create the signature */   

     $_arraysign = array(); 
     $_arraysign[] = $permissions; 
     $_arraysign[] = ''; 
     $_arraysign[] = $expiry; 
     $_arraysign[] = $accountName . '/' . $containerName . '/' . $fileName; 
     $_arraysign[] = ''; 
     $_arraysign[] = "2015-04-05"; //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) 
    ); 
    } 
    static public function getBlobDownloadUrl($container,$blob,$accountName,$key){ 
/* Create the signed query part */   
     $resourceType='b'; 
     $permissions='r'; 
     /*$expTime_utc = new DateTime(null, new DateTimeZone("UTC")); 
     $expTime_utc->add(new DateInterval('PT1H')); 
     $expiry=$expTime_utc->format('Y-m-d\TH:i:s\Z');*/ 
     $expiry = date('Y-m-d\TH:i:s\Z', strtotime('+1 day')); 
     $_signature=AzureServices::getSASForBlob($accountName,$key,$container, $blob, $resourceType, $permissions, $expiry); 
     $_parts = array(); 
     $_parts[] = (!empty($expiry))?'se=' . urlencode($expiry):''; 
     $_parts[] = 'sr=' . $resourceType; 
     $_parts[] = (!empty($permissions))?'sp=' . $permissions:''; 
     $_parts[] = 'sig=' . urlencode($_signature); 
     $_parts[] = "sv=2015-04-05"; 

     /* Create the signed blob URL */ 
     $_url = 'https://' 
     .$accountName.'.blob.core.windows.net/' 
     . $container . '/' 
     . $blob . '?' 
     . implode('&', $_parts); 

     return $_url; 
    } 

私は[] = $アカウント名「行に "/" を追加および削除、同一の構造以下のDateTimeに日付を変更$ _arraysignを試してみました'/'。$ containerName。 '/'。$ fileName "...しかし、何も起こらなかった、同じエラーメッセージが表示されます... 助けてください。 おかげでこのコード行で

答えて

0

@Gaurav Mantriの答えの横に、あなたはに注意する必要がある1つの以上のポイントがあるので、あなたは、2015-04-05signedversionを使用しているように、ある、というhttps://msdn.microsoft.com/en-us/library/azure/dn140255.aspxに署名文字列を構築セクション下の説明に従って:

バージョン2015-04-05では、署名付きのIPフィールドと署名付きプロトコルフィールドのサポートが追加されています。これらは、文字列と記号の間に含める必要があります。 、BLOBまたはファイルサービスリソースのための文字列から記号を構築し、次の形式を使用するには:

$_arraysign = array(); 
$_arraysign[] = $permissions; 
$_arraysign[] = ''; 
$_arraysign[] = $expiry; 
$_arraysign[] = '/blob/' . $accountName . '/' . $container . '/' . $blob; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = "2015-04-05"; //the API version is now required 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 
$_arraysign[] = ''; 

StringToSign = signedpermissions + "\n" + 
      signedstart + "\n" + 
      signedexpiry + "\n" + 
      canonicalizedresource + "\n" + 
      signedidentifier + "\n" + 
      signedIP + "\n" + 
      signedProtocol + "\n" + 
      signedversion + "\n" + 
      rscc + "\n" + 
      rscd + "\n" + 
      rsce + "\n" + 
      rscl + "\n" + 
      rsct 

だから我々は次のように機能getSASForBlob$_arraysignを変更する必要がありますそれ以上の心配があれば、私に知らせてください。

+0

ありがとうございます!両方の助けを借りて、最終的にはうまくいきます! –

0

先頭に追加してください/blob/

$_arraysign[] = $accountName . '/' . $containerName . '/' . $fileName; 

だから、それは次のようになります。

$ _arraysign [] = '/ブロブ/'。 $ accountName。 '/'。 $ containerName。 '/'。 $ fileName;このページから

https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx

文字列のcanonicalizedresouce部分が 署名したリソースへの正規のパスです。 バージョン2015-02-21以降のサービス名(BLOB、テーブル、 キューまたはファイル)、ストレージアカウント の名前、およびリソース名が含まれている必要があり、URLデコードである必要があります。ブロブの名前 には、ブロブのコンテナを含める必要があります。テーブル名は小文字でなければなりません。次の例の は、リソースの種類に応じて、正規化されたリソースの一部( )を文字列の一部として作成する方法を示しています。

関連する問題