Jack Zeng
Jack Zeng

Reputation: 2267

How to contruct an Authorization Header for Azure Storage get container property REST API

I am trying to use the Azure Storage Get Container Properties REST API. I follow the "Authentication for the Azure Storage Services" to construct an Authorization Header for the request. Here is the PowerShell script I use.

$StorageAccount = "<Storage Account Name>"
$Key = "<Storage Account Key>"
$resource = "<Container Name>"

$sharedKey = [System.Convert]::FromBase64String($Key)
$date = [System.DateTime]::UtcNow.ToString("R")

$stringToSign = "GET`n`n`n`n`n`n`n`n`n`n`n`nx-ms-date:$date`nx-ms-version:2009-09-19`n/$StorageAccount/$resource`nrestype:container"

$hasher = New-Object System.Security.Cryptography.HMACSHA256
$hasher.Key = $sharedKey

$signedSignature = [System.Convert]::ToBase64String($hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($stringToSign)))

$authHeader = "SharedKey ${StorageAccount}:$signedSignature"

$headers = @{"x-ms-date"=$date
             "x-ms-version"="2009-09-19"
             "Authorization"=$authHeader}

$container = Invoke-RestMethod -method GET `
             -Uri "https://$StorageAccount.blob.core.windows.net/$resource?restype=container" `
             -Headers $headers

From the above script, I get Authentication failed error. The Authorization header is not correctly formed.

Any idea on how to fix this?

Upvotes: 3

Views: 3224

Answers (1)

Jack Zeng
Jack Zeng

Reputation: 2267

Well, I have made a very stupid error. In the URI of my Invoke-RestMethod, the $resource?restype is recognized as one variable by PowerShell. Since it is not defined, the URI becomes https://$StorageAccount.blob.core.windows.net/=container. Hence, the authentication is always failed. Concatenating the URI will fix the problem.

$URI = "https://$StorageAccount.blob.core.windows.net/$resource"+"?restype=container"
$container = Invoke-RestMethod -method GET -Uri $URI -Headers $headers 

Upvotes: 3

Related Questions