2016-02-12 176 views
0

我想從powershell中使用azure休息API,但堅持授權部分。用於使用本文https://msdn.microsoft.com/en-us/library/azure/dd179428.aspxAzure表休息api授權

腳本生成簽名:

$StorageAccount = "account" 
$Key = "key" 

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

$resource = "/test()?`$top" # also tried /test() /test /test()?`$top=1 
$stringToSign = "$date`n/$StorageAccount$resource" 
$hasher = New-Object System.Security.Cryptography.HMACSHA256 
$hasher.Key = $sharedKey 

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

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

$headers = @{"x-ms-date"=$date 
      "Authorization"=$authHeader 
      "Accept"="application/atom+xml"} 

try { 
    $tables = Invoke-RestMethod -Uri "https://$StorageAccount.table.core.windows.net/test()?`$top=1" -Headers $headers |% { 
     $_.content.properties.tablename 
    } 
} catch [Exception] { 
    $_ 
} 

我能列出表(/表),但是當我試圖執行一些OData的請求(/測試()$ top = 1 here)我收到授權錯誤。

回答

2

我複製你的代碼,並在我的最後嘗試。它工作正常。

這裏有一些我想指出的。

  1. 對於 「查詢實體」,你應該使用$resource = "/test()",並$resource = "/test"是 「插入實體」。 $resource = "/test()?$top"$resource = "/test()?$top=1"不正確。

  2. 確保您的$Key是正確的。既然你已經使用這個鍵來創建表,我不認爲是這種情況。

  3. 確保表格中至少有一行。

+0

感謝您的回覆! '$ Key'是我的存儲帳戶中的主鍵。當我將$ resource設置爲'/ test()'請求失敗並出現auth錯誤時'服務器無法驗證請求。確保授權標頭的值正確形成,包括簽名.' – forik

+0

我還使用'$ key'創建了新表,但我繼續收到授權錯誤:( – forik

+0

)您的腳本是正確的。嘗試使用Azure存儲資源管理器存儲帳戶和密鑰如果不工作,請重新生成密鑰。 –