2017-08-17 2 views
0

Dies ist der Fehler zurückgegeben, wenn ich versuche, einen Klecks in Speicher zugreifen:Warum stimmt meine Azure SAS-Tokensignatur nicht überein?

Code: AuthenticationFailed Nachricht: Server die Anfrage zur Authentifizierung fehlgeschlagen. Stellen Sie sicher, dass der Wert des Autorisierungsheaders ordnungsgemäß einschließlich der Signatur gebildet wird. AuthenticationErrorDetail: Die Signatur stimmt nicht überein. String verwendet, um Zeichen war xxstorageaccount rwdlac b sco 2017-08-17T21: 29: 24Z 2017-08-17T21: 34: 24Z https 2017-04-17

Hier ist mein Code:

$storageAccount = config('azure.storage.account'); 

$start = new \DateTime();  
$end = (new \DateTime())->modify('+5 minutes'); 
$start = $start->format('Y-m-d\TH:i:s\Z'); 
$end = $end->format('Y-m-d\TH:i:s\Z'); 

$toSign = $storageAccount . "\n"; 
$toSign .= "rwdlac" . "\n"; 
$toSign .= "b" . "\n"; 
$toSign .= "sco" . "\n"; 
$toSign .= $start . "\n"; 
$toSign .= $end . "\n"; 
$toSign .= "\n"; 
$toSign .= "https" . "\n"; 
$toSign .= "2017-04-17" . "\n"; 

$signature = rawurlencode(base64_encode(hash_hmac('sha256', $toSign, $sasKeyValue, TRUE))); 
$token = "?sv=2017-04-17&ss=b&srt=sco&sp=rwdlac&se=" . $end . "&st=" . $start . "&spr=https&sig=" . $signature; 

return $uri . $token; 
+0

Was ist der Wert für '$ sasKeyValue' Variable? Ist es der Kontoschlüssel? –

Antwort

1

Sie können 2 Dinge tun, um diesen Fehler zu vermeiden.

  1. Convert und Ende Zeit GMT-Zeit über setTimezone() Funktion oder prüfen, starten Sie den gmdate function stattdessen verwenden.

  2. Decode base64 Kontoschlüssel durch base64_decode() Funktion.

Bitte Ihren Code wie folgt ändern:

$storageAccount = config('azure.storage.account'); 

$start = (new \DateTime())->setTimezone(new DateTimeZone('GMT'));  
$end = (new \DateTime())->setTimezone(new DateTimeZone('GMT'))->modify('+5 minutes'); 
$start = $start->format('Y-m-d\TH:i:s\Z'); 
$end = $end->format('Y-m-d\TH:i:s\Z'); 

$toSign = $storageAccount . "\n"; 
$toSign .= "rwdlac" . "\n"; 
$toSign .= "b" . "\n"; 
$toSign .= "sco" . "\n"; 
$toSign .= $start . "\n"; 
$toSign .= $end . "\n"; 
$toSign .= "\n"; 
$toSign .= "https" . "\n"; 
$toSign .= "2017-04-17" . "\n"; 

$signature = rawurlencode(base64_encode(hash_hmac('sha256', $toSign, base64_decode($sasKeyValue), TRUE))); 
$token = "?sv=2017-04-17&ss=b&srt=sco&sp=rwdlac&se=" . $end . "&st=" . $start . "&spr=https&sig=" . $signature; 

return $uri . $token; 
Verwandte Themen